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

Comment insérer des valeurs dans une colonne IDENTITY dans SQL Server

Si vous avez déjà essayé d'insérer des valeurs dans une colonne d'identité dans SQL Server, vous avez peut-être rencontré une erreur comme celle-ci :

Impossible d'insérer une valeur explicite pour la colonne d'identité dans le tableau "Artistes" lorsque IDENTITY_INSERT est défini sur OFF.

C'est normal. Une colonne d'identité est là pour une raison. Il remplit automatiquement la colonne avec une valeur incrémentielle pour chaque ligne insérée. Par conséquent, vous n'avez pas besoin d'insérer une valeur dans cette colonne.

Cependant, parfois vous faites besoin d'insérer une valeur dans une colonne d'identité. Par exemple, vous pourriez remplir la base de données avec des données qui doivent conserver leurs propres valeurs d'identité. Si tel est le cas, vous devrez remplacer le IDENTITY biens. Voici comment.

Activer IDENTITY_INSERT

Vous pouvez remplacer l'IDENTITY propriété en activant IDENTITY_INSERT . Cela vous permet d'insérer vos propres valeurs dans une colonne d'identité.

Voici un exemple :

SET IDENTITY_INSERT Artists ON;
INSERT INTO Artists (ArtistId, ArtistName, ActiveFrom)   
VALUES 
  (1001, 'AC/DC','1973-01-11'), 
  (1002, 'Allan Holdsworth','1969-01-01'),
  (1003, 'Buddy Rich','1919-01-01');
SET IDENTITY_INSERT Artists OFF;

Dans cet exemple, la table Artists a une colonne d'identité (dans ce cas, ArtistId est la colonne d'identité). Pour remplacer l'IDENTITY propriété nous précédons simplement le INSERT déclaration avec SET IDENTITY_INSERT Artists ON . Cette instruction T-SQL vous permet de dire "Je sais que cette table a une colonne d'identité mais dans ce cas, insérez my valeurs à la place".

Notez que IDENTITY_INSERT ne peut être activé que sur une table à la fois. C'est donc une bonne idée de désactiver IDENTITY_INSERT immédiatement après l'insertion. Cela le remet à son état d'origine et vous permet de remplacer une colonne d'identité sur une autre table si nécessaire.

Aussi, afin d'activer IDENTITY_INSERT l'utilisateur doit posséder la table ou avoir ALTER permission sur la table.

Copier entre les tables

Activation de IDENTITY_INSERT peut également être utile lorsque vous copiez des données entre des tables. Par exemple, vous pourriez remplir une table à partir d'une autre.

Voici un exemple de copie de données de la table Artists vers la table Artists_Archive :

SET IDENTITY_INSERT Artists_Archive ON;
INSERT INTO Artists_Archive (ArtistId, ArtistName, ActiveFrom)
  SELECT ArtistId, ArtistName, ActiveFrom
	FROM Artists;
SET IDENTITY_INSERT Artists_Archive OFF;

Une chose à noter est que, si la colonne d'identité a une contrainte de clé primaire, elle rejettera toutes les valeurs qui existent déjà dans la table de destination. Vous devez donc être absolument sûr que le remplacement de la colonne d'identité est ce que vous voulez absolument faire.