2014-10-11 65 views
0

我有這樣的數據。MySQL查詢:更新重複密鑰,追加數據

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' WHERE A = 'dataC' ON DULPLICATE KEY UPDATE A = CONCAT('dataA', '_1'); 

但它是無效的。任何人都知道如何做到這一點?

回答

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'; 
0

感謝戈登,我已經建立了這個查詢。不能確定這是多麼昂貴,但它工作。

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'); 

請評論,如果這實際上是不好的;

+0

/* php */ $ newdata =「ABC_」; $ length = count($ newdata)+ 1; (''。** $ newdata **。''',1) $ sql + =「 SUBSTRING(t3.A,「。** $ length **。」,100)+ 1)END) – bleach7 2014-10-11 17:32:53