メンチカツ

ロースカツが好きです

MySQLでDELETE IF EXISTSでおこられた

おこなの?

PRIMARY KEY (`key`,`value`) 

のテーブル

key value
1 hoge
1 fuga
2 hoge
3 fuga
4 hogefuga

で、値が「hoge」「fuga」のデータの値を「hogefuga」に統一したい。

key value
1 hogefuga
2 hogefuga
3 hogefuga
4 hogefuga

って形にしたいとき、

--「hoge」を「hogefuga」に更新
update テーブル set value = "hogefuga" where value = "hoge";

--「fuga」かつ同じkeyで「hogefuga」持ってるデータを削除
delete from テーブル where value = "fuga" and exists(
    select t2.* from テーブル t2 where t2.value = "hogefuga" and t2.key = t1.key
);
-- >>> おこられるorz

なもんでこうして対応

--「hoge」を「hogefuga」に更新
update テーブル set value = "hogefuga" where value = "hoge";

--「fuga」かつ同じkeyで「hogefuga」持ってるデータを「deleted」に更新
update テーブル t1
inner join (
    select key from テーブル where value = "hogefuga"
) t2
on t1.key = t2.key
set value = "deleted" where value = "fuga";

--「deleted」データを削除
delete from テーブル where value = "deleted";

なんか回りくどい