суббота, 8 марта 2014 г.

Как изменить поле IDENTITY в MSSQL

По умолчанию вы не можете ничего делать с полем, заданным как IDENTITY, при добавлении записей в БД оно автоматически устанавливается сервером и больше никогда не меняется так что, ели создать вот такую таблицу и попытаться добавить в нее ряд явно задав значение столбца ID:

CREATE TABLE [dbo].[identity_test](
 [id] [int] IDENTITY(1,1) NOT NULL,
 [name] [nvarchar](50) NOT NULL
) 

insert into identity_test values (1,'testname2');

То мы получим вот такую ошибку:
Msg 8101, Level 16, State 1, Line 1
An explicit value for the identity column in table 'identity_test' can only be specified when a column list is used and IDENTITY_INSERT is ON.




в описании которой, в общем-то, содержится подсказка что нужно сделать, чтобы ваш запрос с явным указание id сработал - написать:

SET IDENTITY_INSERT [dbo].[identity_test] ON

А после выполнения действий над колонкой id то же самое, но с OFF в конце. И, кстати, не забудьте это сделать, так как автоматически SET IDENTITY_INSERT действовать не прекращает до конца активной сессии, и вы будет получать ошибку уже при попытки вставить ряд без явного указания значения колонки id. И, кстати, в каждой отдельной базе данных IDENTITY_INSERT может быть включено только для одной таблицы одновременно.

Почему нужно явно включать возможность вставлять значения колонки IDENTITY? Потому, что это должно быть вашим осознанным действием. По умолчанию, вы не можете ничего сделать с этой колонкой, а SQL Server гарантирует вам, что:

Каждое новое значение будет сформировано на основе текущих аргументов seed и increment.
Каждое новое значение для определенной транзакции будет отлично от других параллельных транзакций для таблицы.

То есть, если у вас стоит IDENTITY (7,2), то вы можете быть уверенным в том что ряд автоматически генерируемых значений будет 7,9,11,13 и так далее. Если же вы вставите значение, например,14, то и весть последующий ряд измениться и будет уже 14,16,18...
А вдруг у вас от этого числа что-то зависит.


Комментариев нет:

Отправить комментарий