Om du någonsin har försökt infoga värden i en identitetskolumn i SQL Server, kanske du har sett ett fel som detta:
Det går inte att infoga ett explicit värde för identitetskolumnen i tabellen "Artister" när IDENTITY_INSERT är inställt på AV.
Det här är normalt. En identitetskolumn finns där av en anledning. Den fyller automatiskt i kolumnen med ett ökande värde för varje rad som infogas. Därför behöver du inte infoga ett värde i den kolumnen.
Men ibland gör det måste infoga ett värde i en identitetskolumn. Du kan till exempel fylla databasen med data som behöver behålla sina egna identitetsvärden. Om så är fallet måste du åsidosätta IDENTITY
fast egendom. Så här gör du.
Aktivera IDENTITY_INSERT
Du kan åsidosätta IDENTITY
egenskap genom att aktivera IDENTITY_INSERT
. Detta gör att du kan infoga dina egna värden i en identitetskolumn.
Här är ett exempel:
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 det här exemplet har tabellen Artister en identitetskolumn (i det här fallet är ArtistId identitetskolumnen). För att åsidosätta IDENTITY
egenskap vi helt enkelt föregår INSERT
uttalande med SET IDENTITY_INSERT Artists ON
. Denna T-SQL-sats låter dig säga "Jag vet att den här tabellen har en identitetskolumn men i det här fallet infogar du min värden istället”.
Observera att IDENTITY_INSERT
kan endast aktiveras på ett bord åt gången. Därför är det en bra idé att inaktivera IDENTITY_INSERT
omedelbart efter insättningen. Detta återställer det till sitt ursprungliga tillstånd, och det låter dig åsidosätta en identitetskolumn på en annan tabell om det behövs.
Dessutom för att aktivera IDENTITY_INSERT
Användaren måste äga tabellen eller ha ALTER
tillåtelse på bordet.
Kopiera mellan tabeller
Aktiverar IDENTITY_INSERT
kan också vara användbart när du kopierar data mellan tabeller. Du kan till exempel fylla i en tabell från en annan.
Här är ett exempel på att kopiera data från tabellen Artists till tabellen 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;
En sak att notera är att om identitetskolumnen har en primärnyckelbegränsning kommer den att avvisa alla värden som redan finns i destinationstabellen. Så du måste vara helt säker på att det är vad du definitivt vill göra att åsidosätta identitetskolumnen.