IDENTITY_INSERT - 设置值会重置下一个身份吗?

时间:2011-02-14 16:07:36

标签: sql sql-server database

我对SQL Server不太熟悉,但我正在开发一个脚本,该脚本在IDENTITY ON的表上显式设置值。由于一些计划不周的模式 - 看起来我将不得不明确地插入一些任意高的数字(例如10,000)。

在将来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 个答案:

答案 0 :(得分:11)

关闭IDENTITY_INSERT后,下一个可用身份将为10001。

您可以使用DBCC CHECKIDENT使用RESEED选项重新设置标识字段,以将下一个标识设置回51.执行此操作时的问题是,当表格填满最后一个标记时插入的项具有9999的标识,下一项将导致重复的标识或错误,具体取决于您是否对标识列具有唯一约束。

答案 1 :(得分:1)

在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

答案 2 :(得分:0)

您可以在insert语句中将reseed值设置为表所期望的范围,使用以下内容:(使用的示例客户表)

鉴于表中的最大货币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)

下一次插入到customer表中的CustomerId为11