MySQL 交换具有唯一约束的行值
在 MySQL 中,交换优先级列上具有唯一约束的两行的优先级值可以是挑战。
问题:
使用此语句交换值时:
UPDATE tasks SET priority = CASE WHEN priority=2 THEN 3 WHEN priority=3 THEN 2 END WHERE priority IN (2,3);
由于重复条目违规而发生错误
解决方案:
不幸的是,在 MySQL 中,不使用多个查询或虚假值来交换值是不可能的。这是因为 MySQL 在每行更新后强制进行约束检查,与其他一些 DBMS 不同。
替代方法:
要在不违反约束的情况下交换值,您可以使用在事务中执行以下步骤:
交易声明:
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 ;
注意:
这种方法要求唯一列是没有负值的有符号整数。如果允许负值,则可能需要不同的解决方案。
以上是如何在具有唯一约束的 MySQL 中交换行值?的详细内容。更多信息请关注PHP中文网其他相关文章!