sql >> Databáze >  >> RDS >> Sqlserver

Jak vložit hodnoty do sloupce IDENTITY na serveru SQL Server

Pokud jste se někdy pokusili vložit hodnoty do sloupce identity na serveru SQL Server, možná se vám zobrazila tato chyba:

Nelze vložit explicitní hodnotu pro sloupec identity do tabulky „Umělci“, když je IDENTITY_INSERT nastaveno na VYPNUTO.

To je normální. Sloupec identity je tam z nějakého důvodu. Automaticky vyplní sloupec zvyšující se hodnotou pro každý vložený řádek. Proto není nutné, abyste do tohoto sloupce vkládali hodnotu.

Někdy však děláte potřeba vložit hodnotu do sloupce identity. Můžete například naplňovat databázi daty, která si potřebují zachovat své vlastní hodnoty identity. V takovém případě budete muset přepsat IDENTITY vlastnictví. Zde je návod.

Povolit IDENTITY_INSERT

IDENTITY můžete přepsat aktivací IDENTITY_INSERT . To vám umožní vložit vlastní hodnoty do sloupce identity.

Zde je příklad:

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;

V tomto příkladu má tabulka Artists sloupec identity (v tomto případě ArtistId je sloupec identity). Chcete-li přepsat IDENTITY vlastnost, kterou jednoduše předcházíme INSERT prohlášení s SET IDENTITY_INSERT Artists ON . Tento příkaz T-SQL vám umožňuje říci:„Vím, že tato tabulka má sloupec identity, ale v tomto případě vložte my hodnoty.“

Všimněte si, že IDENTITY_INSERT lze povolit pouze na jedné tabulce současně. Proto je vhodné zakázat IDENTITY_INSERT ihned po vložení. Tím se vrátí do původního stavu a v případě potřeby vám umožní přepsat sloupec identity v jiné tabulce.

Také za účelem povolení IDENTITY_INSERT uživatel musí vlastnit tabulku nebo mít ALTER povolení na stůl.

Kopírování mezi tabulkami

Povolení IDENTITY_INSERT může být také užitečné, když kopírujete data mezi tabulkami. Můžete například naplňovat jednu tabulku z jiné.

Zde je příklad kopírování dat z tabulky Interpreti do tabulky 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;

Jedna věc, kterou je třeba poznamenat, je, že pokud má sloupec identity omezení primárního klíče, odmítne všechny hodnoty, které již existují v cílové tabulce. Takže si musíte být absolutně jisti, že přepsání sloupce identity je to, co rozhodně chcete udělat.


  1. Jaká je výchozí velikost vstupu varchar2 do uložené procedury Oracle a lze ji změnit?

  2. MySQL parametrizované dotazy

  3. Statistika objektů databáze SQL Server

  4. Chyba při mapování postgresových polí v Spring JPA