我偶然发现了一个问题,据说应该在单个MySQL查询中有一个有效的解决方案,但我无法弄明白(我远不是MySQL的专家,唉)。
该表格包括以下列:A,B,C。(A,B)是主键(INTs)。 C - 是一个字符串。该表填充了记录。
在某些情况下,我需要将A列中的值x
更新为新值y
。如果某些记录在A中已经有y
(对于B中具有不同值的记录,可以是多个记录),则会出现“重复键”条件。在这种情况下,我需要为每个特定的b
连接旧记录中的C值和相应的待定更新。
示例:
| A | B | C | 1 | 2 | ABC | 1 | 4 | DEF | 2 | 2 | GHI | 2 | 4 | JKL | 2 | 5 | MNO
在A中更新为2 - > 1,我需要得到:
| A | B | C | 1 | 2 | ABCGHI | 1 | 4 | DEFJKL | 1 | 5 | MNO
有一个众所周知的INSERT ... ON DUPLICATE KEY UPDATE
声明。但是如何在更新时优雅地处理相同的问题?我不确定REPLACE
语句或REPLACE
函数是否以及如何用于该任务。
提前致谢。
答案 0 :(得分:4)
我认为,无论发生什么,你都需要两个陈述:
ALTER TABLE myTable ADD UNIQUE INDEX (A, B);
INSERT INTO myTable (A, B, C)
SELECT 1, B, C
FROM myTable t
WHERE A = 2
ON DUPLICATE KEY UPDATE
C = CONCAT(myTable.C, VALUES(C))
;
DELETE FROM myTable WHERE A = 2;
在sqlfiddle上查看。
如果存在并发问题的风险,您显然需要在事务中执行这些以保持原子性。