DELETE — テーブルから行を削除する
[ WITH [ RECURSIVE ]with_query[, ...] ] DELETE FROM [ ONLY ]table_name[ * ] [ [ AS ]alias] [ USINGusing_list] [ 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として参照しなければなりません。
using_list
WHERE条件内に他のテーブルの列を記述できるようにするための、テーブル式のリストです。
これは、SELECT文のFROM句において指定できるテーブルのリストと似ています。
例えば、テーブル名の別名も指定することができます。
自己結合を設定する目的以外ではusing_listに対象のテーブルを繰り返さないでください。
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が使用可能であることも同様に拡張です。