繁体   English   中英

在具有主键冲突的MySQL中的两行中交换两列

[英]Swapping two columns on two different rows in MySQL with primary key conflict

我正在尝试在两个不同的行(角色)上交换两列。 我知道我可以通过设置用户变量来做到这一点,但是我试图在一个查询中做到所有这些。

我的查询是:

UPDATE table AS t1, table AS t2 
SET t1.role = 'standby', t2.role = 'primary'
WHERE t1.sysid = t2.sysid AND t1.role = 'primary' AND t2.role = 'standby';

表结构是

sysid | role    | devid
1     | primary | dev1
1     | standby | dev2

主键是sysid,role

问题似乎是事务处理时主键之间的冲突,错误为: Error Code: 1706. Primary key/partition key update is not allowed since the table is updated both as 't1' and 't2'.

由于MySQL从左到右处理,因此我尝试先将临时值设置为t1以避免冲突,但是它仍然失败,并出现相同的错误:

SET t1.role = 'tmp', t2.role = 'primary', t1.role = 'standby'

有没有办法用MySQL实现这一目标?

您可以只使用一个临时值来交换角色。 选择一个尚不存在的值,不会导致键冲突。 使用事务来确保数据完整性。

START TRANSACTION;
UPDATE table SET role = 'temprole' WHERE sysid = 1 and role = 'primary';
UPDATE table SET role = 'primary' WHERE sysid = 1 and role = 'standby';
UPDATE table SET role = 'standby' WHERE sysid = 1 and role = 'temprole';
COMMIT;
UPDATE table AS t1 join table AS t2 on t1.sysid=t2.sysid
SET t1.role = if(t1.role = 'primary' AND t2.role = 'standby', 
                 'standby', 
                 if (t2.role = 'primary' AND t1.role = 'standby','primary',t1.role));

加入两个表并根据条件更新一个

更新

我交换了列,但实际上PK不允许执行更新。 呼叫前应设置约束检查

自从我不得不手动创建SQL语句已经过去了几年,但是触发器是否可能?

UPDATE table SET role=IF(role='primary', 'secondary', 'primary') 
WHERE sysid = 1
ORDER BY role ASC;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM