Sql Server Identity列 - >值被重用?

时间:2014-04-07 03:13:28

标签: sql-server identity

不确定我是否过度思考这里的事情......但是......

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

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

当我更新一行时,我正在执行DELETE,然后INSERT。 (是的,我知道MERGE并且可以使用它,但我不是。)

现在我在Id: 11952106

有许多数字未被发现。例如。 1, 2, 3 ..等等。我确实使用了它们但删除了它们

那么.. Sql Server会不会开始使用那些“差距”数字?(不确定技术术语是什么)。

2 个答案:

答案 0 :(得分:3)

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

几个月前,这件事发生在我身上。这是一个痛苦的屁股。我们现在已经进行监控,以预测我们的IDENTITY列何时达到其极限。

有一些技术可以重排行以重复使用间隙值。但是,这些必须由您自己编码。非常小心外键,无论是明示的还是暗示的。

答案 1 :(得分:1)

只是为了扩展实际回答你的问题的评论(顺便说一句是No)。

然而,为了提供更多关于它的信息,但是标识列不是一个完整的序列值,您可以使用它来计算一个保证的订单。 虽然在许多情况下,你会得到这个,直到你开始删除,但身份并不能保证由于插入,回滚甚至服务器重启失败而不会在序列中出现问题。

它的主要用途是生成一个密钥,通常用作代理密钥,因为普通密钥太复杂/太长 - 和/或通过数据集中的索引或约束创建唯一性,但是你不应该&#39 ;预期'价值是一个不间断的数字序列。

如果你想要一个完整的序列,你需要自己在你的代码层或通过创建函数创建它,但我怀疑你只是想知道如果你意识到这一点它的性能开销。