Il n'existe aucun moyen de créer une contrainte déclarative pour ce type de chose. Vous pouvez, bien sûr, créer un déclencheur BEFORE INSERT au niveau de la ligne qui remplirait automatiquement la clé en fonction de la séquence (en ignorant toute valeur fournie si vous êtes préoccupé par les insertions ad hoc qui n'utilisent pas la séquence).
Si vous êtes dans une situation où vous devez incrémenter une séquence parce que de quelqu'un ad hoc insère créé des lignes avec des clés supérieures à la valeur actuelle de la séquence, vos deux options sont
- Créer une boucle qui appelle nextval à plusieurs reprises
- MODIFIEZ la séquence pour définir INCREMENT BY sur la valeur la plus grande dont vous avez besoin, appelez nextval une fois et ALTER la séquence de retour. Cela nécessite que personne d'autre n'utilise la séquence en même temps. Mais c'est utile si vous avez besoin de faire quelque chose comme réinitialiser un tas de séquences après l'actualisation des données d'un environnement différent.
"Créer une boucle qui appelle nextval à plusieurs reprises." Si vous utilisez un RAC à plusieurs noeuds et les caches de séquence (ce qui devrait être le cas sur RAC), l'appel successif de nextval peut ne pas aider. En raison de la mise en cache, les numéros de séquence suivants ne seraient pas incrémentés par les autres noeuds, jusqu'à ce qu'ils aient épuisé leurs valeurs locales mises en cache. –