我们已经开始看到在某些表中创建的身份不再是精确顺序的。也就是说它们仍然保持较高水平,但价值观存在较大差距。
例如,序列是{1,2,3 .. .. 97,98,99}然后跳转到{1092,1093,1094 .. .. 1097,1098,1099}然后是另一个差距然后{4231,4232,4233 .. .. 4257,4258,4259}。
任何人都可以对这种行为有所了解吗?
答案 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)
服务器似乎缓存性能值,因此如果服务器在断电后重置,那么这些值可能会丢失。请参阅此文章。
答案 3 :(得分:1)
这是一个已知的错误。您的巨大差距是由故障转移,服务重启,重新启动等引起的。
在修复之前,除了可能有一个启动过程在所有受影响的表上重新设置标识列之外,你无能为力。