我在MS SQL 2005中有一个表。并且想做:
update Table
set ID = ID + 1
where ID > 5
问题是ID是主键,当我这样做时,我有一个错误,因为当这个查询到达ID为8的行时,它会尝试将值更改为9,但此表中有一个旧行值9并且存在约束违规。
因此我想控制更新查询以确保它以降序执行。
所以不是ID = 1,2,3,4等等,而是ID = 98574(或者其他)然后是98573,98572等等。在这种情况下,不存在约束违规。
那么如何控制更新执行的顺序呢?有没有一种简单的方法可以通过编程方式完成此操作?
答案 0 :(得分:2)
Transact SQL
推迟约束检查,直到语句结束。
这就是为什么这个查询:
UPDATE mytable
SET id = CASE WHEN id = 7 THEN 8 ELSE 7 END
WHERE id IN (7, 8)
不会失败,但会交换id
的{{1}}和7
。
在您的查询完成后,似乎会留下一些重复的值。
答案 1 :(得分:1)
试试这个:
update Table
set ID = ID * 100000 + 1
where ID > 5
update Table
set ID = ID / 100000
where ID > 500000
答案 2 :(得分:0)
不要忘记括号......
更新表 设置ID =(ID * 100000)+ 1 其中ID> 5
如果这里的ID太大,你总是可以使用循环。
答案 3 :(得分:0)
我个人不会这样更新id字段,我会创建一个旧表到新表的工作表。它存储两个ID,然后所有更新都从中完成。如果你没有使用级联删除(这可能会偶然锁定你的表很长一段时间),那么从子表开始并开始工作,另一方面从pk表开始。除非您处于单用户模式,否则不要这样做,或者如果其他用户在表格彼此不一致的情况下进行更改时,您可能会遇到一些令人讨厌的数据完整性问题。
PK更改无所事事,如果可能的话不应该改变。
在以这种方式对生产数据进行任何更改之前,请确保执行完整备份。如果你无法恢复,弄乱这个可能会让你失去工作。