Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment utiliser la propriété IDENTITY() dans SQL Server

Lorsque vous utilisez T-SQL pour créer (ou modifier) ​​une table dans SQL Server, vous avez la possibilité d'utiliser le IDENTITY() propriété pour créer une colonne d'identité.

Une colonne d'identité contient un numéro d'identification qui s'incrémente automatiquement. Le IDENTITY() la propriété peut être utilisée avec le CREATE TABLE et ALTER TABLE déclarations.

Syntaxe

La syntaxe ressemble à ceci :

IDENTITY [ (seed , increment) ]

La graine est la valeur utilisée pour la toute première ligne chargée dans la table.

L'incrément est la valeur incrémentielle qui est ajoutée à la valeur d'identité de la ligne précédente qui a été chargée.

Vous devez spécifier les deux arguments ou aucun. Si vous ne spécifiez ni l'un ni l'autre, la valeur par défaut est (1,1) .

Exemple 1 - Utilisation de base

Voici un exemple pour illustrer.

CREATE TABLE Pets (
    PetId int IDENTITY(1,1) PRIMARY KEY, 
    PetName varchar(255)
    );

Ce code crée une table avec deux colonnes. La première colonne (PetId ) est une colonne d'identité car j'utilise le IDENTITY() propriété dans sa définition.

Maintenant que j'ai créé une colonne d'identité, je peux insérer des noms d'animaux dans le PetName colonne sans avoir besoin d'inclure un ID pour chaque ligne.

INSERT INTO Pets (PetName)
VALUES ('Homer'), ('Felix'), ('Ruff');

SELECT * FROM Pet;

Résultat :

+---------+-----------+
| PetId   | PetName   |
|---------+-----------|
| 1       | Homer     |
| 2       | Felix     |
| 3       | Ruff      |
+---------+-----------+

Exemple 2 - Différentes graines et incréments

Voici un exemple qui utilise une graine et un incrément différents.

Dans ce cas, la graine commence à 150 et s'incrémente de 10 pour chaque ligne.

CREATE TABLE Cities (
    CityId int IDENTITY(150, 10) PRIMARY KEY, 
    CityName varchar(255)
    );

Insérez maintenant des données et sélectionnez-les :

INSERT INTO Cities (CityName)
VALUES ('Auckland'), ('Danang'), ('Khon Kaen');

SELECT * FROM Cities;

Résultat :

+----------+------------+
| CityId   | CityName   |
|----------+------------|
| 150      | Auckland   |
| 160      | Danang     |
| 170      | Khon Kaen  |
+----------+------------+

Exemple 3 - Utilisation incorrecte

Comme mentionné, vous devez spécifier les deux arguments ou aucun. En d'autres termes, vous ne pouvez pas fournir un seul argument. Voici un exemple de ce qui se passe lorsque vous ne fournissez qu'un seul argument.

CREATE TABLE Cities (
    CityId int IDENTITY(1) PRIMARY KEY, 
    CityName varchar(255)
    );

Résultat :

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near ')'.

Exemple 4 - Essayer de remplacer les valeurs d'identité

Si vous essayez de remplacer les valeurs d'identité automatiques, vous risquez d'obtenir une erreur comme celle-ci.

INSERT INTO Cities (CityId, CityName)
VALUES (123, 'Bangkok');

Résultat :

Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table 'Cities' when IDENTITY_INSERT is set to OFF.

C'est parce que vous essayez de remplacer les valeurs créées par IDENTITY() biens. Dans de nombreux cas, il se peut que vous ne saviez tout simplement pas qu'il s'agissait d'une colonne d'identité. Dans ce cas, il vous suffit de supprimer la colonne d'identité de votre INSERT déclaration.

Cependant, si vous faites vraiment besoin de remplacer le IDENTITY() propriété, consultez Comment insérer des valeurs dans une colonne IDENTITY dans SQL Server.

Comme mentionné, si vous n'avez pas besoin de remplacer les valeurs d'identité, vous pouvez simplement supprimer cette colonne de votre INSERT déclaration.

Je peux donc modifier la déclaration précédente en ceci :

INSERT INTO Cities (CityName)
VALUES ('Bangkok');

SELECT * FROM Cities;

Résultat :

+----------+------------+
| CityId   | CityName   |
|----------+------------|
| 150      | Auckland   |
| 160      | Danang     |
| 170      | Khon Kaen  |
| 180      | Bangkok    |
+----------+------------+

Limites de la propriété IDENTITY()

La propriété d'identité sur une colonne garantit ce qui suit :

  • Chaque nouvelle valeur est générée en fonction de la graine et de l'incrément actuels.
  • Chaque nouvelle valeur pour une transaction particulière est différente des autres transactions simultanées sur la table.

Il ne garantit pas ce qui suit :

  • Unicité de la valeur
  • Valeurs consécutives au sein d'une transaction
  • Valeurs consécutives après le redémarrage du serveur ou d'autres échecs
  • Réutilisation des valeurs (par exemple, lorsqu'un INSERT l'opération échoue)

Pour plus d'informations sur ces limitations, consultez la documentation Microsoft.