On this page
Tip
DELETE
DELETE —删除表中的行
Synopsis
[ 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 ] [, ...] ]
Description
DELETE
从指定的表中删除满足WHERE
子句的行。如果没有WHERE
子句,则结果是删除表中的所有行。结果是一个有效但空的表。
Tip
TRUNCATE提供了一种更快的机制来删除表中的所有行。
使用数据库中其他表中包含的信息删除表中的行有两种方法:使用子选择,或在USING
子句中指定其他表。哪种技术更合适取决于具体情况。
可选的RETURNING
子句使DELETE
根据实际删除的每一行计算并返回值。可以计算使用表的列和/或USING
中提到的其他表的列的任何表达式。 RETURNING
列表的语法与SELECT
的输出列表的语法相同。
您必须具有要从表中删除的表的DELETE
特权,以及USING
子句中或其值在* condition
*中读取的任何表的SELECT
特权。
Parameters
with_query
WITH
子句允许您指定一个或多个子查询,这些子查询可以在DELETE
查询中按名称引用。有关详情,请参见Section 7.8和SELECT。
table_name
- 要从中删除行的表的名称(可选,由模式限定)。如果在表名之前指定了
ONLY
,则仅从命名表中删除匹配的行。如果未指定ONLY
,匹配的行也会从继承自命名表的所有表中删除。 (可选)可以在表名称后指定*
,以明确指示包括后代表。
- 要从中删除行的表的名称(可选,由模式限定)。如果在表名之前指定了
alias
- 目标表的替代名称。提供别名后,它将完全隐藏表的实际名称。例如,给定
DELETE FROM foo AS f
,则DELETE
语句的其余部分必须将此表称为f
而不是foo
。
- 目标表的替代名称。提供别名后,它将完全隐藏表的实际名称。例如,给定
from_item
- 一个表表达式,允许其他表中的列出现在
WHERE
条件中。它使用与SELECT
语句的FROM Clause相同的语法;例如,可以指定表名的别名。除非要设置自联接,否则不要将目标表重复为*from_item
(在这种情况下,它必须在from_item
*中以别名出现)。
- 一个表表达式,允许其他表中的列出现在
condition
- 该表达式返回类型为
boolean
的值。仅此表达式返回true
的行将被删除。
- 该表达式返回类型为
cursor_name
- 在
WHERE CURRENT OF
条件中使用的游标名称。要删除的行是从该游标中最近获取的行。游标必须是对DELETE
的目标表的非分组查询。请注意,不能将WHERE CURRENT OF
与布尔条件一起指定。有关将游标与WHERE CURRENT OF
结合使用的更多信息,请参见DECLARE。
- 在
output_expression
- 删除每行后,由
DELETE
命令计算并返回的表达式。该表达式可以使用*table_name
*命名的表或USING
中列出的表的任何列名。写入*
以返回所有列。
- 删除每行后,由
output_name
- 用于返回的列的名称。
Outputs
成功完成后,DELETE
命令将返回以下形式的命令标签:
DELETE count
count
是已删除的行数。请注意,当通过BEFORE DELETE
触发器抑制删除时,该数目可能小于与condition
匹配的行数。如果count
*为 0,则查询没有删除任何行(这不视为错误)。
如果DELETE
命令包含RETURNING
子句,则结果将类似于SELECT
语句的结果,该语句包含在RETURNING
列表中定义的列和值,并通过该命令删除的行进行计算。
Notes
PostgreSQL 允许您通过在USING
子句中指定其他表来引用WHERE
条件中其他表的列。例如,要删除给定 Producer 制作的所有电影,可以执行以下操作:
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');
在某些情况下,连接样式比子选择样式更易于编写或执行。
Examples
删除除音乐剧以外的所有电影:
DELETE FROM films WHERE kind <> 'Musical';
清除表films
:
DELETE FROM films;
删除已完成的任务,返回已删除行的完整详细信息:
DELETE FROM tasks WHERE status = 'DONE' RETURNING *;
删除光标c_tasks
当前所在的tasks
行:
DELETE FROM tasks WHERE CURRENT OF c_tasks;
Compatibility
该命令符合 SQL 标准,除了USING
和RETURNING
子句是 PostgreSQL 扩展,以及将WITH
与DELETE
结合使用的能力。