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.