6.2. データの更新

既にデータベースに入っているデータを修正することを「更新する」と言います。 個別の行、テーブル内の全ての行、あるいは全ての行のサブセットを更新することができます。 各列は、他の列に影響を及ぼすことなく個別に更新することができます。

更新を行うには、3つの情報が必要です。

  1. 更新するテーブルと列の名前、

  2. 更新後の列の値、

  3. 更新する行(複数も可)。

第5章で説明した、一般にSQLでは行に対して一意のIDを指定しないことを思い出してください。 つまり、更新したい行を直接指定できない場合があるということです。 その場合、更新される行が満たすべき条件を指定します。 テーブルにプライマリキーを設定している場合に限り(ユーザが宣言したのかどうかに関係なく)、プライマリキーと一致する条件を選択することで確実に個別の行を指定することができます。 グラフィカルなデータベースアクセスツールは、この方法を使用して行を個別に更新することを可能にしています。

例えば、値段が5である全ての商品の値段を10に更新するには、以下のコマンドを使用します。

UPDATE products SET price = 10 WHERE price = 5;

これによって更新される行の数はゼロであるかもしれませんし、1つ、あるいは多数であるかもしれません。 一致する行がない条件を指定して更新しようとしてもエラーにはなりません。

では、上記のコマンドの詳細を見てみましょう。 最初はUPDATEキーワードで、これにテーブル名が続きます。 いつも通り、テーブル名はスキーマで修飾することもできます。 修飾しない場合はパス内から検索されます。 次にSETキーワードがあり、これに列名、等号、そして更新後の列値が続きます。 更新後の列値は、定数だけでなく任意のスカラ式で表すことができます。 例えば、全ての商品の価格を10%上げるには以下のようにします。

UPDATE products SET price = price * 1.10;

このように、新しい値を表す式で行の中の古い値(複数可)を参照することもできます。 ここでは、WHERE句を省略しました。 WHERE句を省略すると、テーブル内の全ての行が更新されます。 省略しない場合は、WHERE条件に一致する行のみが更新されます。 SET句内の等号が代入を表すのに対し、WHERE句内の等号は比較を表すことに注意してください。 ただし、これによって曖昧さが生じることはありません。 もちろん、必ずしもWHERE条件が等式でなければならないということはありません。 その他にも様々な演算子を使用することができます(第9章を参照)。 だたし、式の評価結果はブール値でなければなりません。

UPDATEコマンドのSET句に複数の値を代入して、複数の列を更新することもできます。 例を示します。

UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a  > 0;