2

我偶然发现了一个问题,据说应该在单个 MySQL 查询中提供有效的解决方案,但我无法弄清楚(唉,我离 MySQL 专家还很远)。

该表具有以下列:A、B、C。(A、B)是主键(INT)。C - 是一个字符串。该表填充有记录。

在某些情况下,我需要将xA 列中的值更新为新值y。如果 A 中已经有一些记录y(可以同时有多个,对于 B 中具有不同值的记录),则出现“重复键”情况。在这种情况下,我需要为每个特定的b.

例子:

| 一个 | 乙| C
| 1 | 2 | 美国广播公司
| 1 | 4 | 国防军
| 2 | 2 | 全球健康指数
| 2 | 4 | JKL
| 2 | 5 | 移动网络运营商

在 A 中更新为 2 -> 1 后,我需要得到:

| 一个 | 乙| C
| 1 | 2 | ABCGHI
| 1 | 4 | DEFJKL
| 1 | 5 | 移动网络运营商

有一个众所周知的INSERT ... ON DUPLICATE KEY UPDATE说法。但是如何优雅地处理更新中的相同问题呢?我不确定REPLACE语句或REPLACE函数是否以及如何用于该任务。

提前致谢。

4

1 回答 1

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

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

于 2012-12-02T22:30:21.543 回答