在 MySQL 中交换值而不违反唯一约束
在 MySQL 中,当应用唯一约束时,在两行之间交换值可能会很困难受影响的列。出现此问题的原因是 MySQL 在每行更新后强制执行约束检查,而不是在整个语句完成后进行约束检查。
要解决此限制,请考虑以下解决方案:
<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中文网其他相关文章!