我有这样的数据。
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');
但无效。有谁知道怎么做?
答案 0 :(得分:1)
如果我理解正确,您需要检查新值是否存在。这有点棘手。您不能使用join
或cross 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');
请评论这是否真的不好;