MW211 EXIT

devlog
MySQL/欠番IDに設定する際に重複チェック
2011年12月13日
適当な欠番「id」に「値」を設定するとすると、以下のような感じになる。
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET `id` = 値                                                           │
│    WHERE `id` IS NULL                                                      │
│    ORDER BY rand()                                                         │
│    LIMIT 1;                                                                │
└──────────────────────────────────────┘

「id」がユニークキー(たいていは主キー)で、
ひょっとしてその値が既に設定されているとまずいので
既に存在しないことを条件追加して相関副問い合わせ化したら
以下のような感じになった。
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET `id` = 値                                                           │
│    WHERE `id` IS NULL                                                      │
│      AND NOT EXISTS (SELECT `id`                                           │
│                          FROM 表                                           │
│                          WHERE `id` = 値                                   │
│                     )                                                      │
│    ORDER BY rand()                                                         │
│    LIMIT 1;                                                                │
└──────────────────────────────────────┘
でも、エラーになります。
「#1093 - You can't specify target table '表' for update in FROM clause」

要は副問い合わせの中に主問い合わせと同じ表を使えないらしい。

仕方ないのでとりあえず、参照してから条件分岐で更新することにした。
なんかいい方法はないものか。
分類:MySQL