既にデータベースに入っているデータを変更することを「更新(update)する」と言います。 個別の行、テーブル内の全ての行、あるいは全ての行のサブセットを更新することができます。 各列は、他の列に影響を及ぼすことなく個別に更新することができます。
既存の行の更新を行うにはUPDATEコマンドを使用してください。 その際には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;