降順または昇順に更新
データを更新する時に更新するデータの行数を指定する方法を確認します。次の書式を使います。
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);
テーブルにはデータを次のように格納しておきます。
では「count」カラムの値が大きいものから順に3件分だけ「price」カラムの値に20加えます。
mysql> update uriage set price = price + 20 -> order by count desc limit 3;
ではデータを取得して確認してみます。
「count」カラムの値が大きいものは、順に「Orange」「Grapes」「Apple」「Peach」「Banana」「Melon」となっています。今回3行だけデータを更新しますので「Orange」「Grapes」「Apple」の3つのデータの「price」カラムに値が20加算されています。
( Written by Tatsuo Ikura )