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

# DELETE

## 名前

DELETE -- テーブルから行を削除する

## 概要

    DELETE FROM [ ONLY ] table [ [ AS ] alias ]
        [ USING usinglist ]
        [ WHERE condition | WHERE CURRENT OF cursor_name ]
        [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

## 説明

`DELETE`は、指定したテーブルから`WHERE`句を満たす行を削除します。 `WHERE`がない場合、指定したテーブルの全ての行を削除することになります。 この結果、そのテーブルは存在するが中身が空のテーブルになります。

> ティップ: PostgreSQLによる拡張であるTRUNCATEは、より高速に、テーブルから全ての行を削除する仕組みを持っています。

デフォルトでは、`DELETE`は指定されたテーブルおよびその全ての子テーブルの行を削除します。 指定されたテーブルのみを削除したい場合は、`ONLY`句を使用してください。

データベース内のほかのテーブルに含まれる情報を用いてテーブル内の行を削除する方法には、副問い合わせと`USING`句で追加テーブルを指定する方法という2つがあります。 どちらの技法が適切かはその状況によります。

省略可能な`RETURNING`句により、`DELETE`は実際に削除された各行に基づいて計算された値を返すようになります。 そのテーブルの列、`USING`で指定された他のテーブルの列、あるいは、その両方を使用した式を計算することができます。 `RETURNING`リストの構文は`SELECT`の出力リストと同一です。

削除を実行するには、そのテーブルの`DELETE`権限が必要です。 また、`USING`句内のテーブルに対する`SELECT`権限、および、`condition`で使用する値を読み取るために、その値が含まれるテーブルに対する`SELECT`権限も必要です。

## パラメータ

`ONLY`

  指定された場合、指名したテーブルのみから行を削除します。 指定されなかった場合、指名したテーブルを継承するテーブルも処理されます。

`table`

  既存のテーブル名です（スキーマ修飾名も可）。

`alias`

  対象テーブルの代理名称です。 別名が与えられた場合、実際のテーブル名は完全に隠蔽されます。 たとえば、`DELETE FROM foo AS f`を考えます。 この`DELETE`文の残りの部分ではこのテーブルを`foo`ではなく`f`として参照しなければなりません。

`usinglist`

  `WHERE`条件内に他のテーブルの列を許可するための、テーブル式のリストです。 これは、`SELECT`文のFROM句において指定できるテーブルのリストと同様です。 例えば、テーブル名の別名も指定することができます。 自己結合を設定する目的以外では`usinglist`に対象のテーブルを繰り返さないでください。

`condition`

  `boolean`型の値を返す式です。 この式が`true`を返す行のみが削除されます。

`cursor_name`

  `WHERE CURRENT OF`条件で使用されるカーソルの名前です。 削除対象の行は、そのカーソルからもっとも最近に取り出される行です。 カーソルは、`DELETE`の対象テーブルに対するグループ化のない問い合わせでなければなりません。 `WHERE CURRENT OF`を論理条件といっしょに指定することはできません。 `WHERE CURRENT OF`付きのカーソルの使用に関する情報についてはDECLAREを参照してください。

`output_expression`

  各行を削除した後に計算され、`DELETE`によって返される式です。 この式には、`table`または`USING`で指定したテーブル（複数可）の任意の列名を使用することができます。 すべての列を返す場合は`*`と記載してください。

`output_name`

  返される列で使用される名前です。

## 出力

正常に終了した場合、`DELETE`コマンドは以下の形式のコマンドタグを返します。

    DELETE count

`count`は削除した行数です。 `count`が0の場合、`condition`を満たす行が存在しなかったことを示します （これはエラーとはみなされません）。

`DELETE`コマンドが`RETURNING`句を持つ場合、その結果は、`RETURNING`リストで定義した列と値を持ち、そのコマンドで削除された行全体に対して計算を行う`SELECT`文の結果と似たものになるでしょう。

## 注釈

PostgreSQLでは、`USING`句で他のテーブルを指定することで、`WHERE`条件内で他のテーブルを参照することができます。 例えば、指定したプロデューサが製作した全ての映画を削除する時は、次のようなコマンドを実行します。

    DELETE FROM films USING producers
      WHERE producer_id = producers.id AND producers.name = 'foo';

ここでは、`films`と`producers`とを結合して、`films`行に削除用の印を付けるという作業を行っています。 この構文は標準に従ったものではありません。 より標準的な方法は以下の通りです。

    DELETE FROM films
      WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');

## 例

filmsテーブルからmusical以外を全て削除します。

    DELETE FROM films WHERE kind <> 'Musical';

`films`テーブルを空にします。

    DELETE FROM films;

完了した作業（statusがDONE）を削除し、削除された行を完全に返します。

    DELETE FROM tasks WHERE status = 'DONE' RETURNING *;

`tasks`において`c_tasks`カーソルが現在位置している行を削除します。

    DELETE FROM tasks WHERE CURRENT OF c_tasks;

## 互換性

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

前のページ | ホーム | 次のページ
DECLARE | 上に戻る | DISCARD