[ WITH [ RECURSIVE ] with_query [, ...] ] DELETE FROM [ ONLY ] table [ [ AS ] alias ] [ USING using_list ] [ 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権限も必要です。
WITH句によりDELETE問い合わせ内で名前で参照可能な1つ以上の副問い合わせを指定することができます。 項7.8とSELECTを参照してください。
指定された場合、指名したテーブルのみから行を削除します。 指定されなかった場合、指名したテーブルを継承するテーブルも処理されます。
既存のテーブル名です(スキーマ修飾名も可)。
対象テーブルの代理名称です。 別名が与えられた場合、実際のテーブル名は完全に隠蔽されます。 たとえば、DELETE FROM foo AS fを考えます。 このDELETE文の残りの部分ではこのテーブルをfooではなくfとして参照しなければなりません。
WHERE条件内に他のテーブルの列を許可するための、テーブル式のリストです。 これは、SELECT文のFROM句において指定できるテーブルのリストと同様です。 例えば、テーブル名の別名も指定することができます。 自己結合を設定する目的以外ではusing_listに対象のテーブルを繰り返さないでください。
boolean型の値を返す式です。 この式がtrueを返す行のみが削除されます。
WHERE CURRENT OF条件で使用されるカーソルの名前です。 削除対象の行は、そのカーソルからもっとも最近に取り出される行です。 カーソルは、DELETEの対象テーブルに対するグループ化のない問い合わせでなければなりません。 WHERE CURRENT OFを論理条件といっしょに指定することはできません。 WHERE CURRENT OF付きのカーソルの使用に関する情報についてはDECLAREを参照してください。
各行を削除した後に計算され、DELETEによって返される式です。 この式には、tableまたはUSINGで指定したテーブル(複数可)の任意の列名を使用することができます。 すべての列を返す場合は*と記載してください。
返される列で使用される名前です。
正常に終了した場合、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');
副問い合わせ形式より結合形式の方が書き易く、実行が速くなることがあります。