バージョンごとのドキュメント一覧

DELETE

DELETE <refpurpose>delete rows of a table</refpurpose> — テーブルから行を削除する

概要

[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
    [ USING from_item [, ...] ]
    [ WHERE condition | WHERE CURRENT OF cursor_name ]
    [ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ]

説明

<title>Description</title>

<command>DELETE</command> deletes rows that satisfy the <literal>WHERE</literal> clause from the specified table. If the <literal>WHERE</literal> clause is absent, the effect is to delete all rows in the table. The result is a valid, but empty table. DELETEは、指定したテーブルからWHERE句を満たす行を削除します。 WHERE句がない場合、指定したテーブルの全ての行を削除することになります。 この結果、そのテーブルは存在するが中身が空のテーブルになります。

ヒント

<link linkend="sql-truncate"><command>TRUNCATE</command></link> provides a faster mechanism to remove all rows from a table. TRUNCATEは、より高速に、テーブルから全ての行を削除する仕組みを提供します。

There are two ways to delete rows in a table using information contained in other tables in the database: using sub-selects, or specifying additional tables in the <literal>USING</literal> clause. Which technique is more appropriate depends on the specific circumstances. データベース内のほかのテーブルに含まれる情報を用いてテーブル内の行を削除する方法には、副SELECTとUSING句で追加テーブルを指定する方法の2つがあります。 どちらの技法が適切かはその状況によります。

The optional <literal>RETURNING</literal> clause causes <command>DELETE</command> to compute and return value(s) based on each row actually deleted. Any expression using the table's columns, and/or columns of other tables mentioned in <literal>USING</literal>, can be computed. The syntax of the <literal>RETURNING</literal> list is identical to that of the output list of <command>SELECT</command>. RETURNING句を指定すると、DELETEは実際に削除された各行に基づいて計算された値を返すようになります。 そのテーブルの列、USINGで指定された他のテーブルの列、あるいは、その両方を使用した式を計算することができます。 RETURNINGリストの構文はSELECTの出力リストと同一です。

You must have the <literal>DELETE</literal> privilege on the table to delete from it, as well as the <literal>SELECT</literal> privilege for any table in the <literal>USING</literal> clause or whose values are read in the <replaceable class="parameter">condition</replaceable>. 削除を実行するには、そのテーブルのDELETE権限が必要です。 また、USING句内のテーブルに対するSELECT権限、および、conditionで使用する値を読み取るために、その値が含まれるテーブルに対するSELECT権限も必要です。

パラメータ

<title>Parameters</title>
with_query

The <literal>WITH</literal> clause allows you to specify one or more subqueries that can be referenced by name in the <command>DELETE</command> query. See <xref linkend="queries-with"/> and <xref linkend="sql-select"/> for details. WITH句によりDELETE問い合わせ内で名前で参照可能な1つ以上の副問い合わせを指定することができます。 詳しくは7.8SELECTを参照してください。

table_name

The name (optionally schema-qualified) of the table to delete rows from. If <literal>ONLY</literal> is specified before the table name, matching rows are deleted from the named table only. If <literal>ONLY</literal> is not specified, matching rows are also deleted from any tables inheriting from the named table. Optionally, <literal>*</literal> can be specified after the table name to explicitly indicate that descendant tables are included. 行を削除するテーブルの名前です(スキーマ修飾名も可)。 テーブル名の前にONLYが指定された場合、そのテーブルでのみマッチする行が削除されます。 ONLYが指定されていない場合、そのテーブルおよび(もしあれば)そのテーブルを継承する全てのテーブルから一致する行が削除されます。 オプションで、テーブル名の後に*を指定することで、明示的に継承するテーブルも含まれることを示すことができます。

alias

A substitute name for the target table. When an alias is provided, it completely hides the actual name of the table. For example, given <literal>DELETE FROM foo AS f</literal>, the remainder of the <command>DELETE</command> statement must refer to this table as <literal>f</literal> not <literal>foo</literal>. 対象テーブルの別名です。 別名が与えられた場合、実際のテーブル名は完全に隠蔽されます。 たとえば、DELETE FROM foo AS fとあるとき、このDELETE文の残りの部分ではこのテーブルをfooではなくfとして参照しなければなりません。

from_item

A table expression allowing columns from other tables to appear in the <literal>WHERE</literal> condition. This uses the same syntax as the <link linkend="sql-from"><literal>FROM</literal></link> clause of a <command>SELECT</command> statement; for example, an alias for the table name can be specified. Do not repeat the target table as a <replaceable class="parameter">from_item</replaceable> unless you wish to set up a self-join (in which case it must appear with an alias in the <replaceable>from_item</replaceable>). WHERE条件内に他のテーブルの列を記述できるようにするための、テーブル式です。 これは、SELECT文のFROM句と同じ文法を使います。例えば、テーブル名の別名が指定できます。 自己結合を行う場合を除き、from_itemに対象のテーブルを繰り返してはいけません(自己結合を行う場合は、from_item内で対象のテーブルとその別名を指定しておく必要があります)。

condition

An expression that returns a value of type <type>boolean</type>. Only rows for which this expression returns <literal>true</literal> will be deleted. boolean型の値を返す式です。 この式がtrueを返す行のみが削除されます。

cursor_name

The name of the cursor to use in a <literal>WHERE CURRENT OF</literal> condition. The row to be deleted is the one most recently fetched from this cursor. The cursor must be a non-grouping query on the <command>DELETE</command>'s target table. Note that <literal>WHERE CURRENT OF</literal> cannot be specified together with a Boolean condition. See <xref linkend="sql-declare"/> for more information about using cursors with <literal>WHERE CURRENT OF</literal>. WHERE CURRENT OF条件で使用されるカーソルの名前です。 削除対象の行は、そのカーソルからもっとも最近に取り出される行です。 カーソルは、DELETEの対象テーブルに対するグループ化のない問い合わせでなければなりません。 WHERE CURRENT OFを論理条件といっしょに指定することはできません。 WHERE CURRENT OF付きのカーソルの使用に関する情報についてはDECLAREを参照してください。

output_expression

An expression to be computed and returned by the <command>DELETE</command> command after each row is deleted. The expression can use any column names of the table named by <replaceable class="parameter">table_name</replaceable> or table(s) listed in <literal>USING</literal>. Write <literal>*</literal> to return all columns. 各行を削除した後にDELETEによって計算され、返される式です。 この式には、table_nameで指名したテーブルまたはUSINGで指定したテーブルの任意の列名を使用することができます。 すべての列を返す場合は*と記載してください。

output_name

A name to use for a returned column. 返される列で使用される名前です。

出力

<title>Outputs</title>

On successful completion, a <command>DELETE</command> command returns a command tag of the form 正常に終了した場合、DELETEコマンドは以下の形式のコマンドタグを返します。

DELETE count

The <replaceable class="parameter">count</replaceable> is the number of rows deleted. Note that the number may be less than the number of rows that matched the <replaceable class="parameter">condition</replaceable> when deletes were suppressed by a <literal>BEFORE DELETE</literal> trigger. If <replaceable class="parameter">count</replaceable> is 0, no rows were deleted by the query (this is not considered an error). countは削除した行数です。 この数は、BEFORE DELETEトリガによって削除が抑止された場合、conditionに合致した行より少なくなる可能性があることに注意してください。 countが0の場合、問い合わせによって削除された行がなかったことを示します (これはエラーとはみなされません)。

If the <command>DELETE</command> command contains a <literal>RETURNING</literal> clause, the result will be similar to that of a <command>SELECT</command> statement containing the columns and values defined in the <literal>RETURNING</literal> list, computed over the row(s) deleted by the command. DELETEコマンドがRETURNING句を持つ場合、その結果は、RETURNINGリストで定義した列と値を持ち、そのコマンドで削除された行全体に対して計算を行うSELECT文の結果と似たものになるでしょう。

注釈

<title>Notes</title>

<productname>PostgreSQL</productname> lets you reference columns of other tables in the <literal>WHERE</literal> condition by specifying the other tables in the <literal>USING</literal> clause. For example, to delete all films produced by a given producer, one can do: PostgreSQLでは、USING句で他のテーブルを指定することで、WHERE条件内で他のテーブルを参照することができます。 例えば、指定したプロデューサが製作した全ての映画を削除する時は、次のようなコマンドを実行します。

DELETE FROM films USING producers
  WHERE producer_id = producers.id AND producers.name = 'foo';

What is essentially happening here is a join between <structname>films</structname> and <structname>producers</structname>, with all successfully joined <structname>films</structname> rows being marked for deletion. This syntax is not standard. A more standard way to do it is: ここでは、filmsproducersとを結合して、films行に削除用の印を付けるという作業を行っています。 この構文は標準に従ったものではありません。 より標準的な方法は以下の通りです。

DELETE FROM films
  WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');

In some cases the join style is easier to write or faster to execute than the sub-select style. 副SELECT形式より結合形式の方が書き易い、あるいは、実行が速くなることがあります。

<title>Examples</title>

Delete all films but musicals: ミュージカル以外の全ての映画を削除します。

DELETE FROM films WHERE kind <> 'Musical';

Clear the table <literal>films</literal>: filmsテーブルを空にします。

DELETE FROM films;

Delete completed tasks, returning full details of the deleted rows: 完了した作業(statusがDONE)を削除し、削除された行のすべての詳細を返します。

DELETE FROM tasks WHERE status = 'DONE' RETURNING *;

Delete the row of <structname>tasks</structname> on which the cursor <literal>c_tasks</literal> is currently positioned: tasksにおいてc_tasksカーソルが現在位置している行を削除します。

DELETE FROM tasks WHERE CURRENT OF c_tasks;

While there is no <literal>LIMIT</literal> clause for <command>DELETE</command>, it is possible to get a similar effect using the same method described in <link linkend="update-limit">the documentation of <command>UPDATE</command></link>: DELETEにはLIMIT句はありませんが、UPDATEの文書で説明したのと同じ方法で同様の効果を得ることができます。

WITH delete_batch AS (
  SELECT l.ctid FROM user_logs AS l
    WHERE l.status = 'archived'
    ORDER BY l.creation_date
    FOR UPDATE
    LIMIT 10000
)
DELETE FROM user_logs AS dl
  USING delete_batch AS del
  WHERE dl.ctid = del.ctid;

互換性

<title>Compatibility</title>

This command conforms to the <acronym>SQL</acronym> standard, except that the <literal>USING</literal> and <literal>RETURNING</literal> clauses are <productname>PostgreSQL</productname> extensions, as is the ability to use <literal>WITH</literal> with <command>DELETE</command>. このコマンドは標準SQLに準拠しています。 ただし、USING句とRETURNING句はPostgreSQLの拡張です。 DELETEWITHが使用可能であることも同様に拡張です。

関連項目

<title>See Also</title> TRUNCATE