2010-10-19 12 views
3

Existe-t-il un moyen de contraindre une colonne (par exemple "ID") à suivre une séquence créée (par exemple "ID_SEQ")?Vérification que la colonne suit une séquence dans Oracle

Sans contrainte automatique, les insertions manuelles risquent de dégrader complètement la séquence. Qu'est-ce qui peut être fait pour régler ceci? Appelez simplement NextVal deux fois?

Répondre

3

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

  1. Créer une boucle qui appelle nextval à plusieurs reprises
  2. 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.
+2

"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. –

7

Vous pouvez utiliser un déclencheur pour accomplir ceci. Exemple:

create or replace trigger product_insert before insert on product for each row begin 
select id_seq.nextval 
into :new.product_id 
from dual; 
end; 
+0

merci pour l'exemple! J'ai trouvé que la première ligne devrait être "... avant d'insérer sur le produit pour chaque ligne commence ..." et tout fonctionne parfaitement à partir de là – echoblaze