MySQL の UPDATE で ORDER BY を使って更新順序を指定する

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の回答がわかりやすいだろう。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.