MySQL查询:重复键上的UPDATE,追加数据

时间:2014-10-11 15:11:13

标签: mysql sql

我有这样的数据。

A       B
----------
dataA   1
dataB   2
dataC   3

----------

我能做到

"UPDATE table SET A = `dataNew` WHERE A = `dataC`;"

但是我在做这样的更新时遇到了问题

"UPDATE table SET A = 'dataA' WHERE A = 'dataC';"

我如何追加以便如果数据存在,它将变为

"UPDATE table SET A = 'dataA_1' WHERE A = 'dataC';" 

我试试

UPDATE table SET A = 'dataA' WHERE A = 'dataC' ON DULPLICATE KEY UPDATE A = CONCAT('dataA', '_1');

但无效。有谁知道怎么做?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要检查新值是否存在。这有点棘手。您不能使用joincross join,因为如果该列不存在,则不会返回任何行。因此,这使用left join

UPDATE table t left join
       (select t.*
        from table t
        where A = 'dataA'
       ) tA
       on 1=1
    SET t.A = (case when tA.A is not null then 'dataA_1' else 'dataA' end)
    WHERE t.A = 'dataC';

答案 1 :(得分:0)

感谢Gordon,我已经构建了这个查询。不能确定这是多么昂贵,但它确实有效。

UPDATE myTable t1 
   LEFT JOIN
      (SELECT * FROM myTable WHERE A = 'ABC') t2 ON 1=1
      LEFT JOIN 
         (SELECT MAX(A) AS A FROM myTable 
            WHERE A REGEXP 'ABC_[0-9]*$') t3 ON 1=1
SET t1.A = 
   (CASE WHEN t2.A IS NULL THEN 'ABC' ELSE
      (CASE WHEN t3.A IS NULL THEN CONCAT('ABC_',1)
         ELSE CONCAT('ABC_',SUBSTRING(t3.A,5,100) + 1) END )
   END)
WHERE t1.A = 'GHI'

我使用的架构。

CREATE TABLE myTable (`A` varchar(20), `B` int, `C` varchar(10)) ;

ALTER TABLE myTable ADD UNIQUE INDEX (A);

INSERT INTO myTable (`A`, `B`, `C`) VALUES
   ('ABC', 1, 'ABC'),
   ('ABC_1', 1, 'ABC'),
   ('ABC_2', 1, 'ABC'),
   ('ABC_245', 1, 'ABC'),
   ('ABC_1asdasd', 1, 'ABC'),
   ('DEF', 2, 'DEF'),
   ('GHI', 3, 'GHI');

请评论这是否真的不好;