我得出的结论是,将要交换的值作为唯一约束的一部分交换两行的唯一方法是将第1行更新为正常范围之外的临时值(例如INT列的负数),将第2行更改为第1行的上一个值,并将第1行更改为第2行的上一个值。
简化示例:
SELECT uniquevalue1 AS prev1 FROM sometable;
SELECT uniquevalue2 AS prev2 FROM sometable;
UPDATE sometable SET uniquevalue1=-1;
UPDATE sometable SET uniquevalue2=[prev1];
UPDATE sometable SET uniquevalue1=[prev2];
随后提交。
这很好,没问题,但是:
此操作可以安全使用吗?
想象一下默认(签名)INT(11)列上的唯一约束,您可以暂时将其交换为-1,然后按照上述模式进行操作 - 当然,禁用自动提交。
如果同时执行这两个交换操作会发生什么?在-1之后缺少提交是否不再是任何行的值意味着语句不会冲突?
答案 0 :(得分:0)
您不能同时执行两个或多个语句。它们总是一个接一个地执行。
但是,如果你使用一个事务(注释:这只适用于innodb类型的表,而不是myisam),这个选择将失败,不做任何更改或成功。在第一个事务完成之前,第二个交换也会尝试使用数字-1。