[英]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.