DELETEは指定したテーブルからWHERE句を満たす行を削除します。 WHEREが無い場合、指定したテーブルの全ての行を削除することになります。 その結果、存在するものの中身が空のテーブルになります。
ティップ: PostgreSQLの拡張であるTRUNCATEは、より高速に、テーブルから全ての行を削除する機構を提供します。
デフォルトで、DELETEは指定されたテーブル及びその全てのサブテーブルの行を削除します。 指定されたテーブルのみを削除したい場合はONLY句を使用してください。
テーブルから削除するためには、そのテーブルのDELETE権限が必要です。 同様に、conditionにおいて値を読み取るテーブルに対するSELECT権限も必要です。
正常に終了した場合、DELETEコマンドは以下の形式のコマンドタグを返します。
DELETE count
countは削除した行数です。 countが0の場合、conditionを満たす行がなかったことを示します。 (これはエラーとはみなされません。)
PostgreSQLではWHERE条件内で他のテーブルを参照することができます。 例えば、指定プロデューサが製作した全ての映画を削除する時に以下のように行うことができます。
DELETE FROM films 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');
副問い合わせ方式より結合方式の方がより記述しやすく、また、より高速な場合があります。 結合方式の欠点は使用されているテーブルの明示的なリストがないことで、このためこの方式ではエラーが発生しやすくなっています。 また、自己結合を扱うことはできません。