我对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.
答案 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