sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man infogar värden i en IDENTITY-kolumn i SQL Server

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.


  1. Praktiskt processorval för SQL Server 2014/2016 OLTP-arbetsbelastningar

  2. Våra mest populära databasblogginlägg 2017

  3. Vad är skillnaden mellan MySQL och SQL?

  4. Hur man visar sammanställningen av en databas i SQL Server (T-SQL)