表中出现的身份有差距

时间:2013-03-21 16:52:29

标签: sql sql-server identity

我们已经开始看到在某些表中创建的身份不再是精确顺序的。也就是说它们仍然保持较高水平,但价值观存在较大差距。

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

任何人都可以对这种行为有所了解吗?

4 个答案:

答案 0 :(得分:2)

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

永远不要依赖或使用代理键的实际值,或者除了作为“连接值”以外的任何内容的标识,以将一个表中的行或行连接到另一个表中的行。当然,从不依赖于连续的价值序列,甚至也不依赖于它们按时间顺序递增。

答案 1 :(得分: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?

答案 2 :(得分:1)

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

Consecutive values after server restart or other failures

答案 3 :(得分:1)

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

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

在修复之前,除了可能有一个启动过程在所有受影响的表上重新设置标识列之外,你无能为力。