MySQL は、UPDATE 文に ORDER BY を利用して更新順序を指定することができる。使う機会は少ないと思うが、一度使ってみて調査したので備忘録として残しておこうと思う。使うタイミングは、
- 複数行を一度に更新する
- ユニークインデックスが設定された列を更新する
という条件を満たしている場合だけだと思う。
MySQL のマニュアルには、
もし UPDATE ステートメントが ORDER BY 条項を含むなら、行は条項に指示された順番で更新されます。これは、エラーが起こるかもしれない特定の場合に有効です。テーブル t が固有インデックスを持つカラム id を含むと仮定してください。次のステートメントは、行が更新される順番によって、複製キー エラーとなり失敗するかもしれません。
UPDATE t SET id = id + 1;例えば、もしテーブルが id カラム内に1と2を含み、2が3に更新される前に1が2に更新されると、エラーが起きます。 この問題を防ぐには、大きい id 値を持つ行が、小さい値を持つ行よりも先に更新されるように ORDER BY 条項を追加してください。
UPDATE t SET id = id + 1 ORDER BY id DESC;
という記述がある。必要にして十分な説明なので、使うことになった背景や内容の説明は不要だろう。
MySQL 以外の DBMS を利用している場合
SQL 標準に対する MySQL 拡張機能に説明があるように、UPDATE 文に ORDER BY や LIMIT を使うのは MySQL の独自仕様なので、他の DBMS で同じことをしたい場合は工夫が必要になる。Google で検索すれば比較的簡単に見つけられるが、PostgreSQL の場合はUpdate top N values using PostgreSQLの回答がわかりやすいだろう。