首页 > 解决方案 > 在 SQL Server 2017 中使用标识列间隙

问题描述

我的桌子上有几 1000 次跳跃。我已经找到了原因,我想说的很晚,这是频繁的服务器故障并重新启动并执行 set identity cache=off

希望这些大的跳跃不会发生。现在我想在新条目的间隙中重用这些数字,最好的方法是什么?改变种子值是可能的吗?请注意,我无法更改任何现有数据。另外,请注意添加新条目的速度很慢(每天少于 10 个条目),我可以密切关注这个数据库,并在必要时再次手动更改种子值。

非常感谢。

标签: sqlsql-serverprimary-keyuniqueidentifiersql-server-2017

解决方案


您可以在脚本的开头和结尾使用SET IDENTITY INSERT table_name ON和为每个实例编写脚本。SET IDENTITY INSERT table_name OFF完整的文档在这里。您一次只能在一张桌子上使用它。

更改种子将无效,因为将始终使用下一个最高值。

以下脚本将有助于识别差距。

SELECT  TOP 1
    id + 1
FROM    mytable mo
WHERE   NOT EXISTS
    (
    SELECT  NULL
    FROM    mytable mi 
    WHERE   mi.id = mo.id + 1
    )
ORDER BY
    id

这是来自这个问题/答案

更新

一种可能的策略是使数据库脱机,使用SET IDENTITY INSERT所需的 ID 填充间隙/跳跃,但否则为最小/空数据,然后再次启用。然后使用空记录,直到全部使用,然后恢复到以前的方法。


推荐阅读