速度改善のためにバルクアップデート使いますよね。
ELT/FIELD
句を使ったバルクアップデートが便利ですが、使い方には要注意です。
結論
WHERE
のid指定とELT/FIELD
のid指定は同じ数でないといけない。
差分更新ができない。
テストケース
進級にあたってクラス名を変更したい。
ただしIDが3の生徒はクラス名が変わらないとします。
■生徒テーブル
ID | クラス名 |
---|---|
1 | 1-Aクラス |
2 | 1-Bクラス |
3 | 1-Cクラス |
4 | 1-Dクラス |
5 | 1-Eクラス |
-- 3番目のレコードだけ更新をスキップしようとした場合
UPDATE `students`
SET `class` = ELT(FIELD(id, 1, 2, 4, 5), '2-Aクラス', '2-Bクラス', '2-Dクラス', '2-Eクラス'),
WHERE `id` IN (1, 2, 3, 4, 5);
■結果
ID | クラス名 |
---|---|
1 | 2-Aクラス |
2 | 2-Bクラス |
3 | null |
4 | 2-Dクラス |
5 | 2-Eクラス |
!?!?!?!?
「WHERE句のid指定数」よりも「ELT/FIELDのid指定数」が少ない場合
ELT/FIELD
で指定が漏れたものに関してはnullで更新される。
「WHERE句のid指定数」よりも「ELT/FIELDのid指定数」が多い場合
WHERE
を基準に実行されるため、更新されない。
特に問題ない