Sql server 为什么我的自动递增Id在SQL Server中跳过数字?
它们似乎是相当大的跳跃,甚至有数千个。下面是一个例子: 此表的最后一个ID高于30.000标记,即使表中的行少于1000行Sql server 为什么我的自动递增Id在SQL Server中跳过数字?,sql-server,sql-server-2012,Sql Server,Sql Server 2012,它们似乎是相当大的跳跃,甚至有数千个。下面是一个例子: 此表的最后一个ID高于30.000标记,即使表中的行少于1000行 这是什么原因造成的 我怎样才能防止将来发生这种情况 我如何才能阻止我当前的桌子继续在这条黑暗的道路上 编辑:这发生在我的一个旧的小型桌面应用程序中,我从未从该表中删除过行,也没有使用过任何事务和回滚。我怀疑行被删除,或者insert语句增加了计数器,但它们是在随后回滚的事务中 看看这个相关的答案,它看起来也可能是由SQL Server缓存未来的标识值,然后在有机会使用
- 这是什么原因造成的
- 我怎样才能防止将来发生这种情况
- 我如何才能阻止我当前的桌子继续在这条黑暗的道路上
编辑:这发生在我的一个旧的小型桌面应用程序中,我从未从该表中删除过行,也没有使用过任何事务和回滚。我怀疑行被删除,或者insert语句增加了计数器,但它们是在随后回滚的事务中 看看这个相关的答案,它看起来也可能是由SQL Server缓存未来的标识值,然后在有机会使用它们之前重新启动造成的
当插入的数据被约束或触发器拒绝时,可能是由于删除和回滚造成的。你不能依赖它 这是什么原因造成的 我想到了几个潜在的原因:
- 行被删除了吗
- 您正在查看的结果不是按
排序的id
- 在未提交的事务中分配了标识符
- 数据库引擎将潜在标识符分配为内部性能优化,但该分配已丢失(例如,意外的服务器重新启动)
黑暗的道路。。。生成唯一标识符?嗯,我想您可以手动提供唯一标识符。guid对这类事情很有用。不过,也有利弊。(我不知道最近的实现是否改善了这一点,但从历史上看,guid不能成为一个好的聚集索引。)这是在sqlserver中设计的。SQL Server保证生成的下一个数字是唯一的和递增的,但不保证它是按顺序生成的
这始于SQL 2012。只需重新启动服务即可重新处理问题。这是众所周知的行为变化,它总是以这种方式记录下来,并以设计为标志。这只是行为上的意外改变,不要再担心差距了——它们真的不是问题!你为什么要阻止这一切?您没有问题,因此没有什么需要修复的。我非常确定,使用
Identity increment
将我的列设置为自动递增,并将Identity Seed
设置为1将导致生成序列号。我弄错了吗?@Alternatex:你一点也没弄错。似乎正在生成序列号。但是在序列生成之外可能会发生一些事情(我想到了四个),这可能会导致你在问题中展示的数据。唯一可能发生的事情是你的第四个假设。所以我想我需要挖得更深一点。@Alternatex:如果你想的话,请随意挖得更深一点,但我真的不明白为什么这会成为一个问题。该标识仍然标识记录。如果系统的其他部分采用了连续标识符,那么这就是问题所在,需要纠正。这不是一个有效的假设,数据库引擎也没有这样的保证。这应该是问题的答案。。。!