Ако някога сте се опитвали да вмъкнете стойности в колона за идентичност в SQL Server, може да сте виждали грешка като тази:
Не може да се вмъкне изрична стойност за колона за идентичност в таблица „Изпълнители“, когато IDENTITY_INSERT е зададен на OFF.
Това е нормално. Колоната за самоличност има причина. Той автоматично попълва колоната с нарастваща стойност за всеки ред, който е вмъкнат. Следователно няма нужда да вмъквате стойност в тази колона.
Понякога обаче правите трябва да вмъкнете стойност в колона за идентичност. Например, може да попълвате базата данни с данни, които трябва да запазят собствените си стойности за идентичност. Ако случаят е такъв, ще трябва да замените IDENTITY
Имот. Ето как.
Активиране на IDENTITY_INSERT
Можете да замените IDENTITY
свойство, като активирате IDENTITY_INSERT
. Това ви позволява да вмъквате свои собствени стойности в колона за идентичност.
Ето един пример:
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;
В този пример таблицата Artists има колона за идентичност (в този случай ArtistId е колоната за идентичност). За да замените IDENTITY
свойството ние просто предхождаме INSERT
изявление с SET IDENTITY_INSERT Artists ON
. Този израз на T-SQL ви позволява да кажете „Знам, че тази таблица има колона за идентичност, но в този случай вмъкнете my вместо това стойности“.
Имайте предвид, че IDENTITY_INSERT
може да се активира само на една маса в даден момент. Затова е добра идея да деактивирате IDENTITY_INSERT
веднага след вмъкването. Това го връща в първоначалното му състояние и ви позволява да замените колона за идентичност в друга таблица, ако е необходимо.
Също така, за да активирате IDENTITY_INSERT
потребителят трябва да притежава таблицата или да има ALTER
разрешение на масата.
Копиране между таблици
Активиране на IDENTITY_INSERT
може също да бъде полезно, когато копирате данни между таблици. Например, може да попълвате една таблица от друга.
Ето пример за копиране на данни от таблицата Artists в таблицата 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;
Едно нещо, което трябва да се отбележи, е, че ако колоната за идентичност има ограничение за първичен ключ, тя ще отхвърли всички стойности, които вече съществуват в таблицата на местоназначението. Така че трябва да сте абсолютно сигурни, че заменянето на колоната за идентичност е това, което определено искате да направите.