降順または昇順に更新

広告

データを更新する時に更新するデータの行数を指定する方法を確認します。次の書式を使います。

UPDATE tbl_name SET col_name1=expr1 [, col_name2=expr2 ...]
  WHERE where_condition
  ORDER BY col_name [ASC | DESC];

更新を行う場合にORDER BY句で指定した方式で並べ替えを行った上で更新を行います。ORDER BY句の詳細はここでは省略しますが、指定のカラムの値に対してASCを指定した場合は昇順、DESCを指定した場合は降順で並べ替えを行います。省略した場合は昇順です。

例えば次のように記述します。

UPDATE uriage SET price = price / 2 WHERE count < 100 ORDER BY count LIMIT 5;

上記では「count」カラムの値が100より小さいデータの中で最初の5行分だけ「price」カラムの値を半分にします。その時、「count」カラムの値で並べ替えを行い、「count」カラムの値が小さいものから順に5行分の更新を行います。

上記のようにLIMIT句と組み合わせて使用する場合が多いと思いますが、ユニーク制約が設定されているカラムの値を対象に更新する場合などに、並べ替えを行った上で更新を行わないとユニーク制約エラーとなってしまう場合などに利用します。

なおあくまで更新時の順番のために並べ替えを行うだけで、実際のデータが並べ替えられて格納されるわけではありません。

サンプル

実際に試してみます。まず次のようなテーブルを作成します。

mysql> create table uriage(name varchar(20), price int, count int);

p9-1

テーブルにはデータを次のように格納しておきます。

p9-2

では「count」カラムの値が大きいものから順に3件分だけ「price」カラムの値に20加えます。

mysql> update uriage set price = price + 20 
    -> order by count desc limit 3;

p9-3

ではデータを取得して確認してみます。

p9-4

「count」カラムの値が大きいものは、順に「Orange」「Grapes」「Apple」「Peach」「Banana」「Melon」となっています。今回3行だけデータを更新しますので「Orange」「Grapes」「Apple」の3つのデータの「price」カラムに値が20加算されています。

( Written by Tatsuo Ikura )