在 MySQL 中交换具有唯一约束的行的值
问题:
你怎么能在不违反表对优先级列的唯一约束的情况下交换 MySQL 中两行的优先级值?
背景:
任务表有一个具有唯一优先级列约束,意味着每一行在该列中可以有唯一的值。更新行时,MySQL 在每次更新后都会检查唯一约束违规,这会阻止直接交换值。
解决方案:
不幸的是,不可能交换直接在 MySQL 中读取行,而不会违反唯一约束或使用虚假值和多个查询。这是由于 MySQL 处理更新的不寻常方式,它在每行更新后而不是更新语句完成后强制执行唯一性检查。
虽然可以使用 ORDER BY 等技巧解决其他 DBMS 的类似问题,此技术不适用于交换值。
替代方案:
可以考虑两种替代方法:
示例(有符号整数且无负值):
如果优先级列是一个不包含负值的有符号整数,您可以使用包含在事务中的以下查询:
<code class="sql">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 ;</code>
以上是如何在具有唯一约束的 MySQL 中交换行优先级值?的详细内容。更多信息请关注PHP中文网其他相关文章!