是否可以在MySQL中完成此操作而不使用伪造的值和多个查询?
不 (我想不到的)。
问题是MySQL如何处理更新。MySQL(与
UPDATE正确实施的其他DBMS不同)以破碎的方式处理更新。它会
UNIQUE在每行更新后强制检查(和其他)约束,而不是在整个
UPDATE语句完成后(应该这样做)进行检查。因此,(大多数)其他DBMS都没有这个问题。
对于某些更新(例如增加所有或某些ID
id=id+1),可以通过使用-另一个非标准功能-
ORDER BY更新中的an来解决。
对于从两行交换值,此技巧无济于事。您必须使用
NULL或虚假值(该值不存在,但您的列中允许使用)和2或3条语句。
您也可以暂时删除唯一约束,但是我认为这并不是一个好主意。
因此,如果唯一列是有符号整数并且没有负值,则可以在事务中使用2条语句:
START TRANSACTION ; UPDATE tasks SET priority = CASE WHEN priority = 2 THEN -3 WHEN priority = 3 THEN -2 END WHERe priority IN (2,3) ; UPDATE tasks SET priority = - priority WHERe priority IN (-2,-3) ;COMMIT ;



