DELETE — テーブルから行を削除する
[ WITH [ RECURSIVE ]with_query
[, ...] ] DELETE FROM [ ONLY ]table_name
[ * ] [ [ AS ]alias
] [ USINGfrom_item
[, ...] ] [ WHEREcondition
| WHERE CURRENT OFcursor_name
] [ RETURNING * |output_expression
[ [ AS ]output_name
] [, ...] ]
DELETE
は、指定したテーブルからWHERE
句を満たす行を削除します。
WHERE
句がない場合、指定したテーブルの全ての行を削除することになります。
この結果、そのテーブルは存在するが中身が空のテーブルになります。
TRUNCATEは、より高速に、テーブルから全ての行を削除する仕組みを提供します。
データベース内のほかのテーブルに含まれる情報を用いてテーブル内の行を削除する方法には、副問い合わせとUSING
句で追加テーブルを指定する方法の2つがあります。
どちらの技法が適切かはその状況によります。
RETURNING
句を指定すると、DELETE
は実際に削除された各行に基づいて計算された値を返すようになります。
そのテーブルの列、USING
で指定された他のテーブルの列、あるいは、その両方を使用した式を計算することができます。
RETURNING
リストの構文はSELECT
の出力リストと同一です。
削除を実行するには、そのテーブルのDELETE
権限が必要です。
また、USING
句内のテーブルに対するSELECT
権限、および、condition
で使用する値を読み取るために、その値が含まれるテーブルに対するSELECT
権限も必要です。
with_query
WITH
句によりDELETE
問い合わせ内で名前で参照可能な1つ以上の副問い合わせを指定することができます。
詳しくは7.8とSELECTを参照してください。
table_name
行を削除するテーブルの名前です(スキーマ修飾名も可)。
テーブル名の前にONLY
が指定された場合、そのテーブルでのみマッチする行が削除されます。
ONLY
が指定されていない場合、そのテーブルおよび(もしあれば)そのテーブルを継承する全てのテーブルから一致する行が削除されます。
オプションで、テーブル名の後に*
を指定することで、明示的に継承するテーブルも含まれることを示すことができます。
alias
対象テーブルの別名です。
別名が与えられた場合、実際のテーブル名は完全に隠蔽されます。
たとえば、DELETE FROM foo AS f
とあるとき、このDELETE
文の残りの部分ではこのテーブルをfoo
ではなくf
として参照しなければなりません。
from_item
WHERE
条件内に他のテーブルの列を記述できるようにするための、テーブル式です。
これは、SELECT
文のFROM
句と同じ文法を使います。例えば、テーブル名の別名が指定できます。
自己結合を行う場合を除き、from_item
に対象のテーブルを繰り返してはいけません(自己結合を行う場合は、from_item
内で対象のテーブルとその別名を指定しておく必要があります)。
condition
boolean
型の値を返す式です。
この式がtrue
を返す行のみが削除されます。
cursor_name
WHERE CURRENT OF
条件で使用されるカーソルの名前です。
削除対象の行は、そのカーソルからもっとも最近に取り出される行です。
カーソルは、DELETE
の対象テーブルに対するグループ化のない問い合わせでなければなりません。
WHERE CURRENT OF
を論理条件といっしょに指定することはできません。
WHERE CURRENT OF
付きのカーソルの使用に関する情報についてはDECLAREを参照してください。
output_expression
各行を削除した後にDELETE
によって計算され、返される式です。
この式には、table_name
で指名したテーブルまたはUSING
で指定したテーブルの任意の列名を使用することができます。
すべての列を返す場合は*
と記載してください。
output_name
返される列で使用される名前です。
正常に終了した場合、DELETE
コマンドは以下の形式のコマンドタグを返します。
DELETE count
count
は削除した行数です。
この数は、BEFORE DELETE
トリガによって削除が抑止された場合、condition
に合致した行より少なくなる可能性があることに注意してください。
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');
副問い合わせ形式より結合形式の方が書き易い、あるいは、実行が速くなることがあります。
ミュージカル以外の全ての映画を削除します。
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の拡張です。
DELETE
でWITH
が使用可能であることも同様に拡張です。