SQL 服务器标识列 - >值被重用?



不确定我是否在这里想太多了...但。。

我正在使用MS Sql Server(我对2008/2012/2014的答案感兴趣)。

我有一个简单的表,其中包含Identity字段。每次插入新行时,它都会自动生成 Id。 从 0 开始,增量为 1。基本的东西。

每当我更新一行时,我都会做一个DELETE然后INSERT.(是的,我知道MERGE并且可以使用它,但我不是)。

现在我在Id: 11952106.

有很多

数字是未确定的。例如。 1, 2, 3..等。。我确实使用了它们,但后来删除了它们

所以。。Sql Server会开始使用这些"差距"数字吗?(不确定技术术语)。

当 IDENTITY 达到数据类型的最大值(对于大约 20 亿个值的 int)时,插入将失败并显示"溢出"类型消息。 它不会环绕到零(或负20亿左右),也不会开始填补空白。

这发生在几个月前的我身上。 这是屁股上的痛苦。 我们现在进行了监视,以预测我们的 IDENTITY 列何时达到其限制。

有一些技术可以将行随机排列以重用间隙值。 但是,这些必须由您自己编码。 对外键(显式和隐含)要非常小心。

只是为了扩展实际回答您的问题的评论(顺便说一下,这是否)。

但是,为了提供有关它的更多信息,但标识列并不意味着可用于按 on 计算保证订单的不间断序列值。尽管在许多情况下,您会得到这一点,直到您也开始删除,但身份并不能保证由于插入失败、回滚甚至服务器重新启动而导致序列中不会出现 gab。

它的主要用途是生成一个键,通常用作代理键,因为普通键太复杂/太长 - 和/或通过跨数据集的索引或约束创建唯一性,但你不应该"期望"值是一个不间断的数字序列。

如果你想要一个不间断的序列,你需要在你的代码层或通过创建函数自己创建它,但我怀疑你只有在意识到其中的性能开销时才想这样做。

最新更新