【发布时间】:2015-06-30 20:17:50
【问题描述】:
我有一个表,它有一个主键 ID 列,并设置为每个新条目递增 1,这是一个相当标准的配置。该表会定期用新记录更新,并每月存档一次到存档表,然后截断。
在正常操作下,截断后进入表的下一条记录将是下一个 ID 值,确保存档表和“实时”表之间的 ID 没有重叠。
由于未知因素,活动表中的 ID 列以某种方式“恢复”为已使用的 ID。因为这个数据库设计得很糟糕,所以现在我遇到了一些数据完整性问题。
我解决此问题的解决方案是更新“实时”表中所有记录的 ID 列,这样就不会与“存档”表中存在的 ID 重叠。更新 ID 后,我将重新设置 Identity 列,这样以后的记录也不会重叠。
我的问题不是重新播种列(使用 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,只是想不出一种聪明的方法来做到这一点。如果您将其放在答案而不是评论中,我会将其标记为“已接受”。
标签: sql-server database sql-server-2005 autonumber