DELETE <refpurpose>delete rows of a table</refpurpose> — テーブルから行を削除する
[ WITH [ RECURSIVE ]with_query
[, ...] ] DELETE FROM [ ONLY ]table_name
[ * ] [ [ AS ]alias
] [ USINGfrom_item
[, ...] ] [ WHEREcondition
| WHERE CURRENT OFcursor_name
] [ RETURNING { * |output_expression
[ [ AS ]output_name
] } [, ...] ]
<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
権限も必要です。
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.8とSELECTを参照してください。
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. 返される列で使用される名前です。
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
文の結果と似たものになるでしょう。
<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:
ここでは、films
とproducers
とを結合して、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形式より結合形式の方が書き易い、あるいは、実行が速くなることがあります。
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;
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の拡張です。
DELETE
でWITH
が使用可能であることも同様に拡張です。