DELETEは、指定したテーブルからWHERE句を満たす行を削除します。 WHEREがない場合、指定したテーブルの全ての行を削除することになります。 この結果、そのテーブルは存在するが中身が空のテーブルになります。
ティップ: PostgreSQLによる拡張であるTRUNCATEは、より高速に、テーブルから全ての行を削除する仕組みを持っています。
デフォルトでは、DELETEは指定されたテーブルおよびその全ての子テーブルの行を削除します。 指定されたテーブルのみを削除したい場合は、ONLY句を使用してください。
データベース内のほかのテーブルに含まれる情報を用いてテーブル内の行を削除する方法には、副問い合わせとUSING句で追加テーブルを指定する方法という2つがあります。 どちらの技法が適切かはその状況によります。
削除を実行するには、そのテーブルのDELETE権限が必要です。 また、USING句内のテーブルに対するSELECT権限、および、conditionで使用する値を読み取るために、その値が含まれるテーブルに対するSELECT権限も必要です。
指定された場合、指名したテーブルのみから行を削除します。 指定されなかった場合、指名したテーブルを継承するテーブルも処理されます。
既存のテーブル名です(スキーマ修飾名も可)。
WHERE条件内に他のテーブルの列を許可するための、テーブル式のリストです。 これは、SELECT文のFROM句において指定できるテーブルのリストと同様です。 例えば、テーブル名の別名も指定することができます。 自己結合を設定する目的以外ではusinglistに対象のテーブルを繰り返さないでください。
削除すべき行を決定する、boolean型の値を返す式です。
正常に終了した場合、DELETEコマンドは以下の形式のコマンドタグを返します。
DELETE count
countは削除した行数です。 countが0の場合、conditionを満たす行が存在しなかったことを示します (これはエラーとはみなされません)。
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');