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.