SQL Server 2008 - 标识列跳过行ID

时间:2010-03-10 15:53:31

标签: sql sql-server

我以前从未见过这种情况,行会是连续的,但我注意到它跳过了特定的“ID”.... 1 2 3 4 6 7 8 ...缺少5 ...

INSERT存储过程中没有事务,因此无需回滚 我们不允许删除记录。

还有什么其他情况?

3 个答案:

答案 0 :(得分:8)

由于表上的某些其他唯一约束或表中的外键引用而您尝试插入无效的fk值,可能是插入失败。

插入不必在事务中。

即使插入失败,标识值也会递增。

伊戈尔提到了关于身份和交易的重要观点。来自docs

  

失败的陈述和交易可以   更改a的当前标识   表并在身份中创造差距   列值。身份值是   即使是,也从未回滚过   尝试插入的事务   表中的值未提交。   例如,如果是INSERT语句   由于IGNORE_DUP_KEY而失败   违规,当前的身份价值   对于表格仍然增加。

答案 1 :(得分:1)

任何方式,身份计数器都不会恢​​复您的价值(如果您已经执行了交易或没有交易)。 oracle(序列)具有相同的行为。

身份不是交易性的。

您可以使用自己的主键计数器并控制对它的访问。

答案 2 :(得分:0)

即使未插入数据表,尝试失败也会生成标识值。然后,这会导致失去一个身份(遗憾的是,我无法找到我学到它的帖子!)。