Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么我的自动递增Id在SQL Server中跳过数字?_Sql Server_Sql Server 2012 - Fatal编程技术网

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

Sql server 为什么我的自动递增Id在SQL Server中跳过数字?,sql-server,sql-server-2012,Sql Server,Sql Server 2012,它们似乎是相当大的跳跃,甚至有数千个。下面是一个例子: 此表的最后一个ID高于30.000标记,即使表中的行少于1000行 这是什么原因造成的 我怎样才能防止将来发生这种情况 我如何才能阻止我当前的桌子继续在这条黑暗的道路上 编辑:这发生在我的一个旧的小型桌面应用程序中,我从未从该表中删除过行,也没有使用过任何事务和回滚。我怀疑行被删除,或者insert语句增加了计数器,但它们是在随后回滚的事务中 看看这个相关的答案,它看起来也可能是由SQL Server缓存未来的标识值,然后在有机会使用

它们似乎是相当大的跳跃,甚至有数千个。下面是一个例子:

此表的最后一个ID高于30.000标记,即使表中的行少于1000行

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

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

我怀疑行被删除,或者insert语句增加了计数器,但它们是在随后回滚的事务中

看看这个相关的答案,它看起来也可能是由SQL Server缓存未来的标识值,然后在有机会使用它们之前重新启动造成的


当插入的数据被约束或触发器拒绝时,可能是由于删除和回滚造成的。你不能依赖它

这是什么原因造成的

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

  • 行被删除了吗
  • 您正在查看的结果不是按
    id
    排序的
  • 在未提交的事务中分配了标识符
  • 数据库引擎将潜在标识符分配为内部性能优化,但该分配已丢失(例如,意外的服务器重新启动)
可能还有更多我没有想到的潜在原因

我怎样才能防止将来发生这种情况

这取决于原因。但这是一个没有实际意义的问题,真的。你为什么要“阻止这一切”?这种情况到底出了什么问题?标识符不需要是连续的,它们只需要是唯一的。(最好是索引的顺序,否则数据库将不得不重新构建索引。)

我如何才能阻止我当前的桌子继续在这条黑暗的道路上


黑暗的道路。。。生成唯一标识符?嗯,我想您可以手动提供唯一标识符。guid对这类事情很有用。不过,也有利弊。(我不知道最近的实现是否改善了这一点,但从历史上看,guid不能成为一个好的聚集索引。)

这是在sqlserver中设计的。SQL Server保证生成的下一个数字是唯一的和递增的,但不保证它是按顺序生成的


这始于SQL 2012。只需重新启动服务即可重新处理问题。这是众所周知的行为变化,它总是以这种方式记录下来,并以设计为标志。这只是行为上的意外改变

,不要再担心差距了——它们真的不是问题!你为什么要阻止这一切?您没有问题,因此没有什么需要修复的。我非常确定,使用
Identity increment
将我的列设置为自动递增,并将
Identity Seed
设置为1将导致生成序列号。我弄错了吗?@Alternatex:你一点也没弄错。似乎正在生成序列号。但是在序列生成之外可能会发生一些事情(我想到了四个),这可能会导致你在问题中展示的数据。唯一可能发生的事情是你的第四个假设。所以我想我需要挖得更深一点。@Alternatex:如果你想的话,请随意挖得更深一点,但我真的不明白为什么这会成为一个问题。该标识仍然标识记录。如果系统的其他部分采用了连续标识符,那么这就是问题所在,需要纠正。这不是一个有效的假设,数据库引擎也没有这样的保证。这应该是问题的答案。。。!