PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# UPDATE

## 名前

UPDATE -- テーブルの行を更新

## 概要

    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`

  更新対象のテーブルの名前です (スキーマ修飾名でも可)。

`column`

  `table`内の列名です。 必要に応じて、列名を副フィールド名や配列の指示子で修飾することも可能です。

`expression`

  列に代入する式です。 テーブル内の対象列やその他の列の古い値を式に使用することができます。

`DEFAULT`

  列にそのデフォルト値を設定します。 (特定のデフォルト式が列に割り当てられていない場合はNULLになります。)

`fromlist`

  `WHERE`条件や更新用の式に他のテーブル上の列を指定できるようにする、テーブル式の集合です。 これは`SELECT`文のFROM 句で指定できるテーブルの列挙に似ています。 自己結合を目的としている場合を除き、対象テーブルは必ずしも`fromlist`内にある必要はありません。 (自己結合の場合は`fromlist`内に別名付きで存在しなければなりません。)

`condition`

  `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;

## 互換性

このコマンドは標準SQLに準拠しています。 ただし`FROM`句はPostgreSQLの拡張です。

他のデータベースシステムの中には、対象テーブルを再度`FROM`内に列挙することを前提とするという意味の`FROM`を提供するものがあります。 これはPostgreSQLにおける`FROM`の解釈方法とは異なります。 こうした拡張を使用するアプリケーションを移植する時に注意してください。

前のページ | ホーム | 次のページ
UNLISTEN | 上に戻る | VACUUM