如何控制Update查询执行的顺序?

时间:2009-04-10 11:51:17

标签: sql-server tsql

我在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等等。在这种情况下,不存在约束违规。

那么如何控制更新执行的顺序呢?有没有一种简单的方法可以通过编程方式完成此操作?

4 个答案:

答案 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更改无所事事,如果可能的话不应该改变。

在以这种方式对生产数据进行任何更改之前,请确保执行完整备份。如果你无法恢复,弄乱这个可能会让你失去工作。