首页  >  文章  >  数据库  >  如何在具有唯一约束的 MySQL 中交换行值?

如何在具有唯一约束的 MySQL 中交换行值?

Linda Hamilton
Linda Hamilton原创
2024-10-26 04:23:31250浏览

 How to Swap Row Values in MySQL with a Unique Constraint?

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 不同。

替代方法:

要在不违反约束的情况下交换值,您可以使用在事务中执行以下步骤:

  1. 用虚假值更新行: 将一行的优先级设置为不存在的负值 (-2),将另一行设置为另一个负值 (-3)。
  2. 使用负值交换值:对虚假值(-priority)求反以交换优先级。
  3. 提交交易:永久应用更改。

交易声明:

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn