MW211 EXIT

devlog
MySQL/更新対象表はサブクエリに使えない
2013年11月08日
INSERT文やUPDATE文で更新する対象の表を、サブクエリで使うとエラーとなる。
┌──────────────────────────────────────┐
│#1093 - You can't specify target table 表 for update in FROM clause         │
└──────────────────────────────────────┘

例えば、「キー」と「所有者」の列からなる表について、
「所有者」が他に所有していない場合のみ、更新できるように条件文を
以下のように付加したとしたら、エラーとなってしまうわけだ。
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 所有者 = 2                                                          │
│    WHERE キー = 1                                                          │
│      AND NOT EXISTS (SELECT *                                              │
│                          FROM 表                                           │
│                          WHERE 所有者 = 2);                                │
└──────────────────────────────────────┘

これの回避方法は一時表を使うこと。以下のような感じ。
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 所有者 = 2                                                          │
│    WHERE キー = 1                                                          │
│      AND NOT EXISTS (SELECT *                                              │
│                          FROM (SELECT * FROM 表) AS 一時表                 │
│                          WHERE 所有者 = 2);                                │
└──────────────────────────────────────┘

循環参照となるので、コピーを一つ用意するような感じだ。
分類:MySQL