UPDATE [ ONLY ] table SET column = { expression | DEFAULT } [, ...] [ FROM fromlist ] [ WHERE condition ]
UPDATE は、条件を満たす全ての行の指定された列の値を変更します。 変更されるべき列のみをSET句に指定する必要があります。 SET句にて明示的に指定されなかった列の値は変更されません。
デフォルトで、UPDATEは指定されたテーブルとそのサブテーブルの行を更新します。 指定されたテーブルのみを更新したい場合は ONLY 句を使用してください。
データベース内の他のテーブルに含まれる情報を使用してテーブルを変更する2つの方法があります。 1つは副問い合わせの使用、もう1つはFROM句で追加するテーブルを指定することです。 どちらの方法が適切かどうかは状況次第です。
テーブルを変更するためにはUPDATE権限が必要です。 あわせて、 expressionやconditionで読み込まれるテーブルへの SELECT 権限も必要になります。
更新対象のテーブルの名前です (スキーマ修飾名でも可)。
table内の列名です。 必要に応じて、列名を副フィールド名や配列の指示子で修飾することも可能です。
列に代入する式です。 テーブル内の対象列やその他の列の古い値を式に使用することができます。
列にそのデフォルト値を設定します。 (特定のデフォルト式が列に割り当てられていない場合はNULLになります。)
WHERE条件や更新用の式に他のテーブル上の列を指定できるようにする、テーブル式の集合です。 これはSELECT文のFROM 句で指定できるテーブルの列挙に似ています。 自己結合を目的としている場合を除き、対象テーブルは必ずしもfromlist内にある必要はありません。 (自己結合の場合はfromlist内に別名付きで存在しなければなりません。)
boolean型の値を返す式です。 この式がtrueを返す行のみが更新されます。
正常に処理が終ると、UPDATEコマンドは以下の形式のコマンドタグを返します。
UPDATE count
countは更新された行数を意味します。 countが0の場合はconditionに一致する行がなかったことを意味します。 (これはエラーとはみなされません。)
FROM句が存在する場合の基本的な動作は、対象テーブルはfromlist内に記述されたテーブルと結合され、結合の出力行が対象テーブルの更新操作を表します。 FROM句を使用する場合、結合が変更対象の各行に対して多くても1つの出力行を生成するように注意してください。 いい換えると、対象行は他のテーブルの複数の行と結合してはなりません。 この場合、対象行を更新するために結合結果の行のいずれか1行のみが使用されますが、どの行が使用されるかたやすく予測できません。
この不決定性のために、結合を使用するよりも可読性が劣化し低速になりますが、他のテーブルの参照を副問い合わせ内のみにすることがより安全です。
filmsテーブルのkind列にあるDramaという単語をDramaticに変更します。
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama';
weatherテーブルのある行に対し、気温項目を調整し、降水量をデフォルト値に戻します。
UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT WHERE city = 'San Francisco' AND date = '2003-07-03';
FROM句構文を使用して、アクメ社を顧客とするセールスマンのセールスカウントを1増加させます。
UPDATE employees SET sales_count = sales_count + 1 FROM accounts WHERE accounts.name = 'Acme Corporation' AND employees.id = accounts.sales_person;
WHERE句で副問い合わせを使用して、同じ操作を行います。
UPDATE employees SET sales_count = sales_count + 1 WHERE id = (SELECT sales_person FROM accounts WHERE name = 'Acme Corporation');
新しい商品とその在庫数を挿入します。 もしその商品が存在している場合は代わりに既存商品の在庫数を更新します。 これをトランザクション全体を失敗させることなく行うためにはセーブポイントを使用してください。
BEGIN; -- 何かしらの他の操作を行います。 SAVEPOINT sp1; INSERT INTO wines VALUES('Chateau Lafite 2003', '24'); -- 上のコマンドが一意キー違反により失敗したものと仮定して、ここで以下の -- コマンドを実行します。 ROLLBACK TO sp1; UPDATE wines SET stock = stock + 24 WHERE winename = 'Chateau Lafite 2003'; -- 他の操作を続け、最後に以下を実行します。 COMMIT;