不确定我是否过度思考这里的事情......但是......
我正在使用MS Sql Server(我对2008/2012 / 2014的答案感兴趣)。
我有一个简单的表,其中包含Identity
字段。每次插入新行时,它都会自动生成Id。从0开始,增量为1.基本内容。
当我更新一行时,我正在执行DELETE
,然后INSERT
。 (是的,我知道MERGE
并且可以使用它,但我不是。)
现在我在Id: 11952106
。
有许多数字未被发现。例如。 1, 2, 3
..等等。我确实使用了它们但删除了它们
那么.. Sql Server会不会开始使用那些“差距”数字?(不确定技术术语是什么)。
答案 0 :(得分:3)
当IDENTITY达到数据类型的最大值时(对于大约20亿个值的int),插入将失败并显示“溢出”类型的消息。它不会回绕到零(或负20亿-Ih),也不会开始填补空白。
几个月前,这件事发生在我身上。这是一个痛苦的屁股。我们现在已经进行监控,以预测我们的IDENTITY列何时达到其极限。有一些技术可以重排行以重复使用间隙值。但是,这些必须由您自己编码。非常小心外键,无论是明示的还是暗示的。
答案 1 :(得分:1)
只是为了扩展实际回答你的问题的评论(顺便说一句是No)。
然而,为了提供更多关于它的信息,但是标识列不是一个完整的序列值,您可以使用它来计算一个保证的订单。 虽然在许多情况下,你会得到这个,直到你开始删除,但身份并不能保证由于插入,回滚甚至服务器重启失败而不会在序列中出现问题。
它的主要用途是生成一个密钥,通常用作代理密钥,因为普通密钥太复杂/太长 - 和/或通过数据集中的索引或约束创建唯一性,但是你不应该&#39 ;预期'价值是一个不间断的数字序列。
如果你想要一个完整的序列,你需要自己在你的代码层或通过创建函数创建它,但我怀疑你只是想知道如果你意识到这一点它的性能开销。