無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

DELETE

名前

DELETE -- テーブルから行を削除する

概要

[ WITH [ RECURSIVE ] 

with_query

 [, ...] ]
DELETE FROM [ ONLY ] 

table_name

 [ * ] [ [ AS ] 

alias

 ]
    [ USING 

using_list

 ]
    [ WHERE 

condition

 | WHERE CURRENT OF 

cursor_name

 ]
    [ RETURNING * | 

output_expression

 [ [ AS ] 

output_name

 ] [, ...] ]

説明

DELETE は、指定したテーブルから WHERE 句を満たす行を削除します。 WHERE がない場合、指定したテーブルの全ての行を削除することになります。 この結果、そのテーブルは存在するが中身が空のテーブルになります。

ティップ: PostgreSQL による拡張である 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');

副問い合わせ形式より結合形式の方が書き易く、実行が速くなることがあります。

filmsテーブルからmusical以外を全て削除します。

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 が使用可能であることも同様に拡張です。


powered by SEO.CUG.NET