Dans cet article, nous allons explorer les bases et les détails de la propriété SQL Server IDENTITY et des fonctionnalités de la colonne IDENTITY. Nous examinerons également comment insérer des valeurs explicites dans les colonnes d'identité via la fonctionnalité IDENTITY_INSERT.
Introduction à la propriété SQL Server IDENTITY et à la colonne IDENTITY
Dans SQL Server, la propriété d'identité nous permet de créer des colonnes d'identité dans les tables SQL Server en fonction des paramètres de la syntaxe de la propriété d'identité. La syntaxe de la propriété d'identité se présente comme suit, et nous appliquons cette syntaxe pour créer ou modifier une instruction de table.
IDENTITÉ [(graine, incrément)]
Dans un premier temps, nous examinerons les paramètres de la propriété d'identité. Cette propriété prend deux paramètres d'entrée :le premier est la graine et le second est l'incrément. Le paramètre seed spécifie que la première valeur de départ de la valeur insérée dans la table et le paramètre Increment définit la valeur d'incrément des données insérées.
Maintenant, nous allons intensifier cette définition principale de la propriété d'identité avec quelques exemples.
Comment créer une colonne d'identité dans SQL Server
Exemple-1 :Dans l'exemple suivant, nous allons créer une colonne d'identité et la première valeur commencera à partir de 1 et incrémentera de 1 par 1.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('La première ligne insérée')INSERT INTO TestIdentityVALUES ('La deuxième ligne insérée')INSERT INTO TestIdentityVALUES ('La troisième ligne insérée')INSERT INTO TestIdentityVALUES ('La quatrième ligne insérée')SELECT Id as [IdentityColumn],Col1 FROM TestIdentity
Exemple-2 :Dans l'exemple suivant, nous allons créer une colonne d'identité et la première valeur commencera à 37 et incrémentera 20 par 20.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(37,20) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('La première ligne insérée')INSERT INTO TestIdentityVALUES ('La deuxième ligne insérée')INSERT INTO TestIdentityVALUES ('La troisième ligne insérée')INSERT INTO TestIdentityVALUES ('La quatrième ligne insérée')SELECT Id as [IdentityColumn],Col1 FROM TestIdentity
Comme vous pouvez le voir dans l'exemple ci-dessus, la propriété d'identité fournit la génération des valeurs d'auto-incrémentation en fonction des paramètres de départ et d'identité.
Comment insérer des valeurs explicites dans la colonne d'identité SQL Server ?
Par défaut, la propriété d'identité ne nous permet pas d'insérer des valeurs explicites dans les colonnes d'identité. Si vous essayez d'insérer des valeurs explicites dans une colonne d'identité, vous rencontrerez l'erreur suivante.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES (1,'La première ligne insérée')
Msg 8101, Niveau 16, État 1, Ligne 9
Une valeur explicite pour la colonne d'identité dans table, 'TestIdentity' ne peut être spécifié que lorsqu'une liste de colonnes est utilisée et que IDENTITY_INSERT est activé.
Nous pouvons surmonter cette erreur en activant la fonctionnalité IDENTITY_INSERT de la table. Maintenant, nous allons modifier l'instruction d'insertion comme suit.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) VALUES (1,'La première ligne insérée')SET IDENTITY_INSERT IdentitéTest OFFSELECT * FROM IdentitéTest
Un autre point clé de ce problème est que nous devons écrire une liste de colonnes pour insérer l'instruction. Si nous ne le faisons pas, nous rencontrerons l'erreur suivante.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity VALUES (1,'La première ligne insérée')SET IDENTITY_INSERT TestIdentity OFF
Msg 8101, Niveau 16, État 1, Ligne 9
Une valeur explicite pour la colonne d'identité dans table, 'TestIdentity' ne peut être spécifié que lorsqu'une liste de colonnes est utilisée et que IDENTITY_INSERT est activé.
Cette erreur indique que la liste de colonnes est manquante dans l'instruction d'insertion. Dans la déclaration d'insertion ci-dessous, nous corrigerons cette erreur.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) ---column listVALUES (90,'La première ligne insérée ')SET IDENTITY_INSERT TestIdentity OFF
Dans certains cas, nous devons insérer des données dans une table à partir d'une autre table. L'une des meilleures façons d'effectuer cette opération consiste à utiliser les instructions "INSERT INTO SELECT". Cependant, si la table cible a une colonne d'identité, nous devons activer l'option IDENTITY_INSERT dans la table cible. De plus, nous devons écrire la liste des colonnes de la table cible.
DROP TABLE IF EXISTS TestIdentityDROP TABLE IF EXISTS SourceTable CREATE TABLE SourceTable (ID INT,Val1 VARCHAR(100))INSERT INTO SourceTable VALUES (1,'First Row'),(2,'Second Row')GOCREATE TABLE TestIdentity( Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) SELECT * FROM SourceTableSET IDENTITY_INSERT TestIdentity OFF
L'inconvénient de l'option IDENTITY_INSERT est qu'elle peut provoquer un écart entre les valeurs de la colonne d'identité. Une instruction similaire à la suivante générera un écart entre les valeurs de la colonne d'identité.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))INSERT INTO TestIdentity ---column listVALUES ('La première ligne insérée (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) ---column listVALUES (90,'La deuxième ligne insérée (INDENTITY_INSERT_ON')SET IDENTITY_INSERT TestIdentity OFFINSERT INTO TestIdentity ---column listVALUES ('La troisième ligne insérée (INDENTITY_INSERT_OFF)')SELECT * FROM TestIdentity
Commande DBCC CHECKIDENT
La commande DBCC CHECKIDENT nous permet d'obtenir des détails sur la dernière valeur de la colonne d'identité. Cette fonction permet également de réinitialiser et de changer la valeur actuelle de la colonne d'identité en une autre valeur. Maintenant, nous allons obtenir la dernière valeur de l'identité via la commande DBCC CHECKIDENT.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('La première ligne insérée')INSERT INTO TestIdentityVALUES ('La deuxième ligne insérée')INSERT INTO TestIdentityVALUES ('La troisième ligne insérée')INSERT INTO TestIdentityVALUES ('La quatrième ligne insérée')DBCC CHECKIDENT ('TestIdentity', NORESEED)
Une autre option concernant la commande DBCC CHECKIDENT consiste à réinitialiser la colonne d'identité sur une valeur requise. Dans l'exemple suivant, le paramètre RESEED modifie la valeur maximale de la colonne d'identité à 100 et les valeurs insérées par la suite utilisent cette valeur maximale.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES ('La première ligne insérée')INSERT INTO TestIdentityVALUES ('La deuxième ligne insérée')INSERT INTO TestIdentityVALUES ('La troisième ligne insérée')INSERT INTO TestIdentityVALUES ('La quatrième ligne insérée')GODBCC CHECKIDENT ('TestIdentity',RESEED,100)GOINSERT INTO TestIdentityVALUES ('La cinquième ligne insérée')SELECT * FROM TestIdentity
Colonne d'identité et unicité de SQL Server
Les colonnes d'identité ne garantissent pas la génération de valeurs uniques. Il s'agit du problème de confusion courant concernant les colonnes d'identité, donc si nous voulons garantir l'unicité des valeurs générées, nous pouvons utiliser l'index unique pour ces colonnes. Maintenant, nous allons prouver et démontrer comment créer des valeurs en double sur les colonnes d'identité.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1)VALUES (1,'La première ligne insérée (INDENTITY_INSERT_OFF)' )INSERT INTO TestIdentity (Id,Col1)VALUES (1,'La première ligne insérée (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity
De plus, les colonnes d'identité et les clés primaires sont deux objets différents dans SQL Server. Le but d'utilisation de la colonne d'identité est de générer le nombre auto-incrémenté. D'autre part, la contrainte de clé primaire garantit et fournit l'unicité des valeurs dans une colonne particulière. La contrainte de clé primaire applique les valeurs uniques pour les colonnes définies car, par défaut, la clé primaire crée un index unique clusterisé dans la table. Dans l'usage courant, la contrainte de clé primaire et la propriété d'identité peuvent être utilisées ensemble. Cette approche d'utilisation nous aide à apporter la flexibilité de l'unicité de la clé primaire et de la fonctionnalité d'auto-incrémentation de l'identité à la colonne appliquée. Dans l'exemple suivant, nous ajouterons également une contrainte de clé primaire à la colonne Id et cela empêchera de dupliquer les valeurs insérées.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) PRIMARY KEY,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1)VALUES (1,'La première ligne insérée (INDENTITY_INSERT_OFF )')INSERT INTO TestIdentity (Id,Col1)VALUES (1,'La première ligne insérée (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity
Lorsque nous naviguons dans l'onglet Index de la table TestIdentity dans l'explorateur d'objets, nous pouvons trouver un index clusterisé unique créé par contrainte de clé primaire. Cette contrainte s'applique à des valeurs uniques pour la colonne Id.
Conclusion
Dans cet article, nous avons abordé les concepts fondamentaux et les méthodes d'utilisation de la propriété SQL Server Identity et des colonnes Identity.
Références
- CRÉER UNE TABLE (Transact-SQL) IDENTITÉ (Propriété)
- Créer des clés primaires