MySQL:UPDATE ...在DUPLICATE键“另一个更新”?

时间:2012-12-02 22:23:46

标签: mysql duplicates sql-update

我偶然发现了一个问题,据说应该在单个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函数是否以及如何用于该任务。

提前致谢。

1 个答案:

答案 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上查看。

如果存在并发问题的风险,您显然需要在事务中执行这些以保持原子性。