IDENTITY_INSERT - 设置值会重置下一个标识吗?

5
我不太熟悉SQL Server,但我正在编写一个脚本,用于在具有IDENTITY ON的表上显式设置插入值。由于一些规划不良的模式 - 看起来我将不得不明确地插入到一些任意高的数字(例如10,000)。
在未来的INSERT(不是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个回答

15

在关闭了 IDENTITY_INSERT 之后,下一个可用的标识将为10001。

您可以使用 DBCC CHECKIDENT 命令并使用 RESEED 选项重新设置标识列的值,使下一个标识列的值回到51。但这样做存在一个问题,当表填满到最后插入项的标识为9999时,下一个项将会导致重复的标识或错误,这取决于您是否在标识列上有唯一约束。


是的,我刚测试了一下 - 任何新的插入都会发生在10,001处。我会研究使用“newreseedvalue”或“RESEED”来重置种子,就像你提到的那样。非常感谢。 - Jerrold

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


1

在插入语句中,您可以使用以下方式将重新生成的值设置为表所期望的范围:(以客户表为例)

假设在下面的插入操作之前,表中当前最大的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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接