説明
DELETEは、指定されたテーブルからWHERE句を満たす行を削除します。 WHERE句がない場合、テーブル内のすべての行が削除されます。 結果は有効ですが、空のテーブルです。
TRUNCATEは、テーブルからすべての行を削除するためのより高速なメカニズムを提供します。
データベース内の他のテーブルに含まれる情報を使用してテーブル内の行を削除するには、サブ選択を使用するか、using句で追加のテーブルを指定するかの2つの方法があります。 どのテクニックがより適切かは、特定の状況に依存します。
オプションのRETURNING句を使用すると、実際に削除された各行に基づいてDELETEが計算され、値が返されます。 テーブルの列、および /またはusingで言及されている他のテーブルの列を使用する任意の式を計算できます。 RETURNINGリストの構文は、SELECTの出力リストの構文と同じです。
テーブルから削除するには、テーブルに対するDELETE特権と、USING句内のテーブルまたはconditionで値が読み取られるテーブルに対するSELECT特権が必要です。
概要
[ WITH [ RECURSIVE ] with_query [, ...] ]]
[のみ] table_name [ * ] [ [ AS] エイリアス] から削除
[USING from_item [, ...] ]
[WHERE condition | cursor_nameの現在の場所]
[RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] パラメーター
with_query:WITH句を使用すると、DELETEクエリで名前で参照できる1つ以上のサブクエリを指定できます。table_name: 行を削除するテーブルの名前 (スキーマ修飾) 。 テーブル名の前にONLYを指定した場合、一致する行は名前付きテーブルからのみ削除されます。ONLYが指定されていない場合、名前付きテーブルから継承されているテーブルからも一致する行が削除されます。 必要に応じて、テーブル名の後に*を指定して、子孫テーブルが含まれることを明示的に示すことができます。alias: ターゲットテーブルの代替名。 エイリアスを指定すると、テーブルの実際の名前が完全に非表示になります。 たとえば、DELETE FROM foo AS fを指定すると、DELETE文の残りの部分は、このテーブルをfnotfooとして参照する必要があります。from_item: 他のテーブルの列をWHERE条件に表示できるテーブル式です。 これは、SELECTステートメントのFROM句と同じ構文を使用します。たとえば、テーブル名のエイリアスを指定できます。 自己結合を設定しない限り、ターゲットテーブルをfrom_itemとして繰り返さないでください (この場合、from_itemにエイリアスを付けて表示する必要があります) 。条件:boolean型の値を返す式。 この式がtrueを返す行のみが削除されます。cursor_name:WHERE CURRENT of条件で使用するカーソルの名前。 削除される行は、このカーソルから最後にフェッチされた行です。 カーソルは、DELETEのターゲットテーブルに対する非グループ化クエリである必要があります。WHERE CURRENT OFはブール条件と共に指定できません。output_expression: 各行が削除された後にDELETEコマンドによって計算され、返される式。 この式では、table_nameで指定されたテーブルまたはUSINGに記載されているテーブルの任意の列名を使用できます。 すべての列を返すには*を書き込みます。output_name: 返された列に使用する名前。
出力
DELETEコマンドが正常に完了すると、
DELETEカウントcountは削除された行の数です。
この数は、削除前トリガーによって削除が抑制されたときに条件に一致した行の数よりも少ない場合があります。 countが0の場合、クエリによって削除された行はありません (エラーとは見なされません) 。
DELETEコマンドにRETURNING句が含まれている場合、結果は、コマンドによって削除された行に対して計算された、RETURNINGリストで定義された列と値を含むSELECTステートメントの結果と同様になります。
注
PolarDB PostgreSQLでは、USING句で他のテーブルを指定することで、WHERE条件で他のテーブルの列を参照できます。 たとえば、特定のプロデューサーが制作したすべての映画を削除するには、次のようにします。
プロデューサーを使用して映画から削除
WHERE producer_id = producers.id AN D producers.name = 'foo'; ここで本質的に起こっているのは、映画とプロデューサーの間の結合であり、結合に成功したすべての映画の行は削除のためにマークされています。 この構文は標準ではありません。 それを行うためのより標準的な方法は次のとおりです。
映画から削除
WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo'); 場合によっては、結合スタイルは、サブ選択スタイルよりも書き込みが容易であるか、または実行が高速である。
例
ミュージカルを除くすべての映画を削除する:
映画から削除するWHERE親切 <> 'ミュージカル';テーブルフィルムをクリアする:
映画から削除します。完了したタスクを削除し、削除された行の詳細を返す:
DELETE FROMタスクWHEREステータス='DONE' RETURNING *;カーソルc_tasksが現在配置されているtasksの行を削除します。
c_tasksの現在のタスクから削除します。