在 SQL Server 中删除记录后重置标识种子

新手上路,请多包涵

我已将记录插入到 SQL Server 数据库表中。该表定义了一个主键,并且自动增量标识种子设置为“是”。这样做主要是因为在 SQL Azure 中,每个表都必须定义一个主键和标识。

但由于我必须从表中删除一些记录,这些表的标识种子将受到干扰,并且索引列(自动生成,增量为 1)将受到干扰。

删除记录后如何重置标识列,以便该列按数字升序排列?

标识列不用作数据库中任何地方的外键。

原文由 xorpower 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 639
2 个回答

DBCC CHECKIDENT 管理命令用于重置身份计数器。命令语法为:

 DBCC CHECKIDENT (table_name [, { NORESEED | { RESEED [, new_reseed_value ]}}])
[ WITH NO_INFOMSGS ]

例子:

 DBCC CHECKIDENT ('[TestTable]', RESEED, 0);
GO

它在以前版本的 Azure SQL 数据库中不受支持,但现在受支持。


感谢 Solomon Rutzky ,该命令的 文档 现已修复。

原文由 Petr Abdulin 发布,翻译遵循 CC BY-SA 4.0 许可协议

似乎这里的大多数回复都假设表是空的,并且需要重置 Identity 值。但是,我如何阅读这个问题是@xorpower 现在有一个包含记录 1、2、3、5、6、7、12、13、14 等的表……并希望有一种方法可以将其恢复为连续列表. (1、2、3、4、5、6、7、8、9 等…)

cf But since I have to delete some records from the table, 其中 some 是恕我直言的神奇词。

AFAIK 在 MSSQL 中没有这样的东西;在最坏的情况下,您确实可以将现有记录表转储到一个新表中并从那里开始。我的问题也是:你为什么要这样做?那么 IDENTITY 列是最好的方法吗?

无论如何,这里提供的关心现有数据的解决方案主要是关于复制临时表中的所有内容, TRUNCATE 现有表;重新播种表,然后再次复制所有内容。我确信这可行,但如果你有很多数据,那么这是一个相当繁重的操作。就我个人而言,我宁愿创建一个相同的表,复制该新表中的数据(可能分批?),然后最后 SWITCH 将数据放入原始表并再次删除新创建的表。您可能需要在 SWITCH 之后执行 CHECKIDENT 。这样,您只需将数据从一个表移动到另一个表一次。为了节省空间,您甚至可以 DELETE 批量复制后原始表中的相关记录。

PS:是的,我知道这是一个老问题,但考虑到它的高分,它仍然出现在类似问题的首位,而且由于没有人提到 SWITCH 但它似乎值得添加。

原文由 deroby 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进