sql >> Database >  >> RDS >> Sqlserver

Waarden invoegen in een IDENTITY-kolom in SQL Server

Als je ooit hebt geprobeerd waarden in een identiteitskolom in SQL Server in te voegen, heb je mogelijk een fout als deze gezien:

Kan geen expliciete waarde invoegen voor identiteitskolom in tabel 'Artiesten' wanneer IDENTITY_INSERT is ingesteld op UIT.

Dit is normaal. Een identiteitskolom is er niet voor niets. Het vult automatisch de kolom met een oplopende waarde voor elke rij die is ingevoegd. U hoeft dus geen waarde in die kolom in te voeren.

Soms echter doe je moet een waarde invoegen in een identiteitskolom. U kunt bijvoorbeeld de database vullen met gegevens die hun eigen identiteitswaarden moeten behouden. Als dit het geval is, moet u de IDENTITY . overschrijven eigendom. Hier is hoe.

IDENTITY_INSERT inschakelen

U kunt de IDENTITY . overschrijven eigenschap door IDENTITY_INSERT . in te schakelen . Hiermee kunt u uw eigen waarden invoegen in een identiteitskolom.

Hier is een voorbeeld:

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;

In dit voorbeeld heeft de tabel Artists een identiteitskolom (in dit geval is ArtistId de identiteitskolom). Om de IDENTITY te overschrijven eigenschap gaan we gewoon vooraf aan de INSERT statement met SET IDENTITY_INSERT Artists ON . Met deze T-SQL-instructie kunt u zeggen:"Ik weet dat deze tabel een identiteitskolom heeft, maar voeg in dit geval mijn in waarden in plaats".

Merk op dat IDENTITY_INSERT kan slechts op één tafel tegelijk worden ingeschakeld. Daarom is het een goed idee om IDENTITY_INSERT uit te schakelen onmiddellijk na het invoegen. Hierdoor wordt het teruggezet naar de oorspronkelijke staat en kunt u indien nodig een identiteitskolom in een andere tabel overschrijven.

Om IDENTITY_INSERT . in te schakelen, de gebruiker moet eigenaar zijn van de tafel of ALTER . hebben toestemming op de tafel.

Kopiëren tussen tabellen

IDENTITY_INSERT inschakelen kan ook handig zijn wanneer u gegevens tussen tabellen kopieert. U kunt bijvoorbeeld de ene tabel van de andere vullen.

Hier is een voorbeeld van het kopiëren van gegevens van de tabel Artists naar de tabel 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;

Een ding om op te merken is dat, als de identiteitskolom een ​​primaire sleutelbeperking heeft, deze alle waarden verwerpt die al in de doeltabel bestaan. Je moet er dus absoluut zeker van zijn dat het overschrijven van de identiteitskolom is wat je zeker wilt doen.


  1. Gebruikt het gebruik van NULL in PostgreSQL nog steeds een NULL-bitmap in de header?

  2. Recursieve trigger voorkomen in PostgreSQL

  3. ver.2 PyGreSQL ERROR:from _pg import * ImportError:DLL load failed:De opgegeven module kon niet worden gevonden

  4. Hoe voeg ik meerdere waarden tegelijk in een postgres-tabel in?