【发布时间】:2015-04-16 10:33:19
【问题描述】:
我得出的结论是,在要交换的值是唯一约束的一部分的情况下,交换两行的唯一方法是将第 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 之后没有提交是否不再是任何行的值意味着语句不会发生冲突?
【问题讨论】:
标签: mysql unique-constraint atomic