IDENTITY_INSERT - Значение параметра сбрасывает следующий идентификатор? - PullRequest
1 голос
/ 14 февраля 2011

Я не слишком знаком с SQL Server, но я работаю над сценарием, который явно устанавливает значения для вставок в таблицы с включенным IDENTITY. Из-за некоторых плохо спланированных схем - похоже, мне придется явно вставить какое-то произвольно большое число (например, 10000).

В будущем INSERT s (не INDENTIY_INSERTS), будет ли он вставлен в 10,001? Или самый низкий «свободный» слот?

Например - таблица в настоящее время имеет строки 1-50, и я делаю IDENTITY_INSERT, который выглядит следующим образом

SET IDENTITY_INSERT [dbo].[ConditionPathways] ON
INSERT INTO [dbo].[ConditionPathways] ([ConditionPathwayID], [ConditionSegmentID], [WorkflowDefinitionID]) 
VALUES (10000, 10000, 10000)
SET IDENTITY_INSERT [dbo].[ConditionPathways] OFF

Будет ли следующая "нормальная" вставка, поместите ее в 10001 или 51? Я действительно надеюсь, что его 51.

Ответы [ 3 ]

11 голосов
/ 14 февраля 2011

После выключения IDENTITY_INSERT следующим доступным идентификатором будет 10001.

Вы можете повторно заполнить поле идентификатора, используя DBCC CHECKIDENT с параметром RESEED, чтобы установитьследующее удостоверение обратно к 51. Проблема в этом состоит в том, что, когда таблица заполняется до точки, где последний вставленный элемент имел идентичность 9999, следующий элемент приведет либо к дублированию идентичности, либо к ошибке, в зависимости от того,иметь уникальное ограничение на столбец идентичности.

1 голос
/ 14 февраля 2011

сделал пример в MSSQL server 2008r2

drop table identityTest_tbl

Go

create table IdentityTest_tbl (id int IDENTITY(1,1) primary key not null, name varchar(10) not null);

go

set identity_insert identityTest_tbl on;
insert into IdentityTest_tbl (id, name) values (10, 'a');
insert into IdentityTest_tbl (id, name) values (11, 'b');
set identity_insert identityTest_tbl off;

GO

insert into IdentityTest_tbl values ('c');

go

select * from IdentityTest_tbl

к сожалению, похоже, что 'c' вставлено с идентификатором 12

0 голосов
/ 21 декабря 2012

Вы можете в операторе вставки установить значение повторного заполнения в диапазон, ожидаемый таблицей, используя следующее: (Пример использования таблицы клиента)

Учитывая, что максимальный ток CustomerId в таблице равен 10 до вставки ниже.

SET IDENTITY_INSERT CUSTOMER ON

INSERT INTO Customer    
(CustomerID , FirstName, LastName, Title, DoB, Email, IsActive, DTInserted , DTUpdated)
VALUES
(10000, 'U','V','W','1/1/2000','1/1/2000',0,GETDATE(), GETDATE())
SET IDENTITY_INSERT CUSTOMER OFF

DECLARE @Reseed AS INT
SET     @Reseed = (SELECT MAX(CustomerID) FROM Customer WHERE CustomerID < 10000)
DBCC CHECKIDENT('Customer', RESEED,@Reseed)

Следующая вставка в таблицу клиентов будет иметь CustomerId 11

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...