为什么我的自动递增的Id跳过SQL Server中的数字?

Alt*_*tex 6 sql-server sql-server-2012

它们似乎是相当大的跳跃,甚至成千上万.这是一个例子:

图表A.

该表的最后一个ID超过了30.000标记,即使表中的行数少于一千行.

  • 是什么造成的?
  • 我怎么能在将来防止这种情况发生?
  • 如何阻止我现在的桌子在这条黑暗的道路上继续?

编辑:这发生在我的一个旧的,小型的桌面应用程序中,我还没有删除此表中的行,也没有使用任何事务和回滚.

Gre*_*reg 11

这是在SQL服务器中设计的.SQL Server保证生成的下一个数字将是唯一的和增量的,但不保证它将按顺序排列.

这是从SQL 2012开始的.只需重新启动服务即可重现问题.众所周知,行为的变化,一直以这种方式记录,并以设计为标志.它只是一种意想不到的行为改变

  • 这应该是问题的答案……! (2认同)

Dav*_*vid 8

是什么造成的?

我想到了几个潜在的原因:

  • 行被删除了?
  • 您正在查看的结果没有排序id
  • 标识符是在未提交的事务中分配的?
  • 数据库引擎将潜在标识符分配为内部性能调优,并且分配丢失(例如,意外的服务器重新启动)?

可能会有更多我没想到的潜在原因.

我怎么能在将来防止这种情况发生?

取决于原因.但这确实是一个有争议的问题.你为什么要"防止这种情况"?这种情况究竟出了什么问题?标识符不需要是连续的,它们只需要是唯一的.(最好是索引顺序,否则数据库必须重新构建索引.)

如何阻止我现在的桌子在这条黑暗的道路上继续?

......生成唯一标识符的黑暗之路?好吧,我猜你可以手动提供唯一标识符.GUID对于那种事情很有用.但是有利有弊.(我不知道最近的实现是否已经改进了这一点,但历史上GUID并没有提供良好的聚簇索引.)