0

我有一个表,它有一个主键 ID 列,并设置为每个新条目递增 1,这是一个相当标准的配置。该表会定期用新记录更新,并每月存档一次到存档表,然后截断。

在正常操作下,截断后进入表的下一条记录将是下一个 ID 值,确保存档表和“实时”表之间的 ID 没有重叠。

由于未知因素,活动表中的 ID 列以某种方式“恢复”为已使用的 ID。因为这个数据库设计得很糟糕,所以现在我遇到了一些数据完整性问题。

我解决此问题的解决方案是更新“实时”表中所有记录的 ID 列,这样就不会与“存档”表中存在的 ID 重叠。一旦我更新了 ID,我将重新设置 Identity 列,这样以后的记录也不会重叠。

我的问题不是关于重新播种列(使用 DBCC——我知道如何做到这一点),而是关于如何使用新的 ID 值重新编号现有记录。我应该使用循环的动态 SQL 查询(删除记录、插入记录)来执行此操作,还是有一些我不知道的 SQL Server 函数可以自动重新编号 ID 列?

4

2 回答 2

1

这看起来是这个问题的重复 - How to update Identity Column in SQL Server?

那里对话的结果是可以这样做但不建议这样做 - 特别是如果有任何其他表在外键等中引用此标识符值。最好使用游标或类似物循环并重新创建记录,正如您在问题中提到的那样。

于 2015-06-30T20:22:30.973 回答
0

只需使用 CTE 进行简单更新即可。如果您希望 ID 从某个位置开始,这就是注释中的偏移量。

with myCTE as (
 select row_number() over (order by auditDate) + 0 rn/*This is whatever you want the ID's to start at*/, * from testTable 
)
update myCTE set id= rn;

这是 SQL 小提琴(我使用了另一个示例中的一个非常简单的表,但应该很容易看出发生了什么)

http://sqlfiddle.com/#!3/ef0b36/1

于 2015-06-30T20:24:16.140 回答