動かざることバグの如し

近づきたいよ 君の理想に

MySQLでバルクアップデートをする

MySQLでもbulk update ・・・的なことをしたかった話。

普通にアップデートするだけだと

UPDATE users SET yatin = 'taro' WHERE id = 1;
UPDATE users SET yatin = 'hanako' WHERE id = 2;

て書くが、1レコードごとに1クエリ走ってしまい、5万行を一括で更新するときとかだと以上に遅い。

そこでON DUPLICATE KEY UPDATE使えばいいじゃんって話になるのだが、

INSERT INTO users (id, name) 
VALUES(1,'taro'), (2, 'hanako') 
ON DUPLICATE KEY UPDATE name = VALUES(name);

IDが無かった場合はインサートされてしまうし、1つでもNOT NULLなカラムがあると指定しないとコケるので向いていない。

ってときはELT&FIELD構文が一番便利

ELT&FIELD構文

以下の例はID1,2をそれぞれtaro,hanakoにする例。複数カラムをそれぞれ更新することもできる

UPDATE users
   SET name = ELT(FIELD(id, 1, 2), 'taro', 'hanako') WHERE ID IN (1, 2)

参考リンク