1

我们已经开始看到在我们的一些表中创建的身份不再是精确顺序的。也就是说,它们仍然会逐渐升高,但价值之间存在很大差距。

例如,序列是 {1,2,3.. .. .. 97,98,99},然后跳转到 {1092,1093,1094.. .. 1097,1098,1099},然后是另一个间隙,然后是 { 4231,4232,4233.. .. 4257,4258,4259}。

任何人都可以阐明这种行为吗?

4

4 回答 4

2

如果您对具有标识列的表执行插入操作,并且插入失败(出于任何原因),标识值仍会递增,并且下一次插入将留下间隙。此外,如果您删除行,显然会有间隙。

永远不要依赖或使用代理键的实际值或身份,而不是作为“连接值”将一个表中的行连接到另一个表中的行。当然永远不要依赖连续的值序列,甚至不要依赖它们是按时间顺序增加的。

于 2013-03-21T16:56:51.133 回答
1

每当您插入带有标识列的表时,它都会增加标识。如果您删除这些行,或者即使您将插入回滚到该表中,标识列也会保持新的增量。

这是一个显示回滚事务效果的脚本:

create table #temp (TheKey int identity(1,1), TheValue int)

insert into #Temp (TheValue) values (1)
select max(TheKey) from #Temp  --1 as expected

begin tran 
insert into #Temp (TheValue) values (1)
select max(TheKey) from #Temp  --2 as expected
rollback
select max(TheKey) from #Temp  --1 as expected

insert into #Temp (TheValue) values (1)
select max(TheKey) from #Temp  --3 a little bit of a surprise?
于 2013-03-21T17:02:51.220 回答
1

似乎服务器缓存了性能值,因此如果服务器在断电后重置,那么这些值可能会丢失。见这篇文章。

服务器重启或其他故障后的连续值

于 2013-03-21T17:05:01.997 回答
1

这是一个已知的错误。您的巨大差距是由故障转移、服务重新启动、重新启动等引起的。

http://connect.microsoft.com/SQLServer/feedback/details/739013/failover-or-restart-results-in-reseed-of-identity

在它被修复之前,除了可能有一个启动过程来为所有受影响的表上的标识列重新设定种子之外,您无能为力。

于 2013-03-21T17:33:53.023 回答