我有一个表,其中有一个主键ID列,并设置为每个新条目增加1,一个相当标准的配置。该表定期用新记录进行更新,每月一次归档到归档表,然后截断。SQL Server标识列重编号
在正常操作下,截断后进入表的下一条记录将是下一个ID值的任何值,确保归档表和“实时”表之间的ID没有重叠。
由于未知因素,活动表中的ID列以某种方式“恢复”回到已经使用的ID。由于这个数据库设计不佳,现在我遇到了一些数据完整性问题。
我的解决方案是更新“活”表中所有记录的ID列,以便与“存档”表中存在的ID无重叠。一旦我更新了ID,我将重新填写标识列,以便将来的记录也不会重叠。
我的问题不在于重新填充列(使用DBCC - 我知道如何做到这一点),而是关于如何使用新的ID值重新编号现有记录。我应该使用循环动态SQL查询(删除记录,插入记录)来做到这一点,还是有一些SQL Server的功能,我不知道可以自动重新编号ID列?
不知道为什么你需要循环或动态SQL。 'BEGIN TRANSACTION; DECLARE @i INT; SELECT @i = MAX(id)FROM dbo.table WITH(HOLDLOCK); INSERT dbo.table(othercols)SELECT othercols FROM dbo.table; DELETE dbo.table WHERE id <= @i; COMMIT TRANSACTION;' –
这是我寻找的答案类型,谢谢!我知道它不一定需要dyn SQL,只是想不出一个聪明的做法。如果你把这个答案放在答案中而不是评论中,我会将它标记为“已接受”。 – LegendaryDude