2009-05-29 20 views
1

Je suis un peu rouillé avec mes déclencheurs et ce pas, et essaie de comprendre ce problème pour une classe:SQL: Aucune solution de contournement de fonction d'identité en utilisant des déclencheurs

Dans une base de données TEST tables ne pas l'option de la fonction IDENTITÉ. En d'autres termes, lorsque nous insérons une ligne dans la table "Users", nous aimerions que la clé primaire "UserID" s'incrémente automatiquement. S'il vous plaît suggérer une solution de contournement pour implémenter cette fonctionnalité sans une telle fonctionnalité intégrée. (Indice: Vous pouvez toujours utiliser des fonctions, des procédures stockées, des séquences, des triggers, etc.)

+0

Que diriez-vous d'ajouter une étiquette de devoirs? – Mathias

Répondre

0

Vous utilisez une séquence, et c'est très commun avec Oracle, qui ne l'a pas (ou n'a pas fait une seule fois, il peut avoir changé) colonnes d'identité. Puisque ce sont les devoirs, je vais vous laisser imaginer le reste d'ici.

1

Utilisez une colonne Int pour la clé primaire de table appelée ID.

Vous pouvez ensuite utiliser un au lieu de Insert Trigger, pour renseigner/calculer la valeur à insérer pour ID.

Le déclencheur détermine quel est l'identifiant existant maximum pour la table en question (en utilisant select MAX ID de TableA) puis l'incrémente de 1 pour chaque enregistrement à insérer.

S'il n'y a aucun enregistrement dans la table, la valeur de l'ID est 1.

+1

Il est important ici de noter que votre mode d'isolation de transaction est critique! Si vous utilisez un niveau d'isolation READ COMMITTED normal, il est possible que deux processus génèrent le même ID, ce qui serait une mauvaise chose. Vous devrez donc utiliser un niveau d'isolement SERIALIZABLE à l'intérieur du déclencheur, sinon vous pourriez avoir des problèmes. Ou mieux encore, évitez-le complètement et utilisez une IDENTITÉ ;-) –

+0

@Dave +1: Un point très important à considérer. –