sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan indsætter du værdier i en IDENTITY-kolonne i SQL Server

Hvis du nogensinde har prøvet at indsætte værdier i en identitetskolonne i SQL Server, har du muligvis set en fejl som denne:

Kan ikke indsætte eksplicit værdi for identitetskolonnen i tabellen "Kunstnere", når IDENTITY_INSERT er indstillet til FRA.

Dette er normalt. En identitetskolonne er der af en grund. Den udfylder automatisk kolonnen med en stigende værdi for hver række, der er indsat. Derfor er det ikke nødvendigt for dig at indsætte en værdi i den kolonne.

Men nogle gange gør det skal indsætte en værdi i en identitetskolonne. For eksempel kan du udfylde databasen med data, der skal bevare sine egne identitetsværdier. Hvis dette er tilfældet, skal du tilsidesætte IDENTITY ejendom. Sådan gør du.

Aktiver IDENTITY_INSERT

Du kan tilsidesætte IDENTITY egenskab ved at aktivere IDENTITY_INSERT . Dette giver dig mulighed for at indsætte dine egne værdier i en identitetskolonne.

Her er et eksempel:

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;

I dette eksempel har tabellen Artists en identitetskolonne (i dette tilfælde er ArtistId identitetskolonnen). For at tilsidesætte IDENTITY egenskaben går vi simpelthen forud for INSERT erklæring med SET IDENTITY_INSERT Artists ON . Denne T-SQL-sætning giver dig mulighed for at sige "Jeg ved, at denne tabel har en identitetskolonne, men i dette tilfælde skal du indsætte min værdier i stedet”.

Bemærk, at IDENTITY_INSERT kan kun aktiveres på ét bord ad gangen. Derfor er det en god idé at deaktivere IDENTITY_INSERT umiddelbart efter indsættelsen. Dette sætter den tilbage til sin oprindelige tilstand, og det giver dig mulighed for at tilsidesætte en identitetskolonne på en anden tabel, hvis det kræves.

Også for at aktivere IDENTITY_INSERT brugeren skal eje tabellen eller have ALTER tilladelse på bordet.

Kopiering mellem tabeller

Aktiverer IDENTITY_INSERT kan også være nyttig, når du kopierer data mellem tabeller. For eksempel kan du udfylde en tabel fra en anden.

Her er et eksempel på kopiering af data fra Artists-tabellen til Artists_Archive-tabellen:

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;

En ting at bemærke er, at hvis identitetskolonnen har en primær nøglebegrænsning, vil den afvise alle værdier, der allerede findes i destinationstabellen. Så du skal være helt sikker på, at tilsidesættelse af identitetskolonnen er det, du helt sikkert vil gøre.


  1. MariaDB og Docker use cases, del 1

  2. Returner 0, hvis feltet er null i MySQL

  3. Postgresql trunkeringshastighed

  4. Et par små problemer med Hekaton prøver