Compréhension approfondie des fonctions @@IDENTITY
, SCOPE_IDENTITY()
, IDENT_CURRENT()
et IDENTITY()
de SQL Server
Dans la programmation de bases de données SQL, obtenir la dernière valeur d'identité insérée est une tâche critique. Diverses fonctions sont prévues à cet effet, chacune avec ses propres nuances. SCOPE_IDENTITY()
, IDENTITY()
, @@IDENTITY
et IDENT_CURRENT()
sont quelques-unes des fonctions les plus couramment utilisées, mais les différences entre elles peuvent prêter à confusion.
Comprendre la portée
Comprendre le concept de « portée » est essentiel pour comprendre les différences entre ces fonctions. En SQL, la portée fait référence au niveau auquel une requête ou un bloc de code s'exécute. Il existe deux périmètres principaux :
Différence de fonction
En fonction de la portée et de la fonction, voici la répartition de chaque fonction :
@@IDENTITY
: Renvoie la dernière valeur d'identité créée dans la même session. Cette fonction ne dépend pas de la portée de la requête ou de la procédure stockée et est généralement utilisée pour récupérer des valeurs d'identité globales. SCOPE_IDENTITY()
: Renvoie la dernière valeur d'identité créée au sein de la même session et de la même portée. Contrairement à @@IDENTITY
, cette fonction ne prend en compte que le contexte de la requête ou de la procédure stockée actuelle. IDENT_CURRENT(name)
: Renvoie la dernière valeur d'identité créée pour une table ou une vue spécifique, quelle que soit la portée de la session ou de la requête. Cette fonction peut être utilisée pour récupérer des valeurs d'identité sur différentes requêtes et sessions. IDENTITY()
: Contrairement aux trois autres fonctions, IDENTITY()
est principalement utilisée pour générer des valeurs d'identité dans les requêtes SELECT...INTO
. Il ne récupère pas les valeurs d'identité existantes. Scénarios d'utilisation
Pour illustrer ces différences, considérons le scénario suivant :
@@IDENTITY
. <code class="language-sql">INSERT INTO MyTable (Name) OUTPUT INSERTED.ID INTO @Identity; PRINT @Identity; -- 打印全局插入的标识值</code>
MyTable
pour insérer un enregistrement dans une autre table et récupérer la valeur d'identité des deux tables. <code class="language-sql">CREATE TRIGGER MyTrigger ON MyTable AFTER INSERT AS INSERT INTO OtherTable (Name) VALUES (NEW.Name); INSERT INTO MyTable (Name) VALUES ('Test'); SELECT @@identity AS MyIdentity; -- 打印在MyTable中插入的标识值 SELECT scope_identity() AS TriggerIdentity; -- 打印触发器在OtherTable中插入的标识值</code>
Dans ces scénarios, @@IDENTITY
et SCOPE_IDENTITY()
se comportent différemment en raison de l'implication du déclencheur.
Suggestions de bonnes pratiques
Dans la plupart des cas, SCOPE_IDENTITY()
est la fonction recommandée pour récupérer la dernière valeur d'identité créée. Il fournit les valeurs les plus fiables et contextuelles dans la requête ou la procédure stockée actuelle. Cependant, si vous devez récupérer une valeur d'identité dans une portée ou une session différente, IDENT_CURRENT(name)
fournit cette fonctionnalité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!