3.2. データの更新

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

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

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

  2. 更新後の列の値、

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

Chapter 2 で説明したように、一般に 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 句内の等号は比較を表しますが、これによってあいまいさが生じることはありません。 必ずしも条件が等式でなければならないということはありません。 その他にもさまざまな演算子を使用することができます (Chapter 6 を参照)。 だたし、式の評価結果はブール値でなければなりません。

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

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