DELETE
DELETE — 删除表中的行
语法
[ 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 ] [, ...] ]
描述
DELETE
从指定表中删除满足WHERE
子句的行。如果WHERE
子句不存在,则效果是删除表中的所有行。结果是一个有效但为空的表。
提示
TRUNCATE
提供了一种更快的机制来从表中删除所有行。
使用数据库中其他表中的信息,有两种方法可以在表中删除行:使用子查询,或在USING
子句中指定其他表。哪种技术更合适取决于具体情况。
可选的RETURNING
子句导致DELETE
计算并返回基于每个实际删除的行的一个或多个值。可以使用表的列和/或USING
中提到的其他表的列的任何表达式进行计算。RETURNING
列表的语法与SELECT
的输出列表相同。
您必须具有要从中删除的表的DELETE
权限,以及USING
子句中的任何表的SELECT
权限,或在*condition
*中读取其值。
参数
with_query
WITH
子句允许您指定一个或多个子查询,这些子查询可以在DELETE
查询中按名称引用。有关详细信息,请参见 第 7.8 节 和 SELECT。table_name
要从中删除行的表的名称(可选的模式限定)。如果在表名前指定了
ONLY
,则仅从命名的表中删除匹配的行。如果未指定ONLY
,则还从继承自命名表的任何表中删除匹配的行。此外,可以在表名后指定*
以明确指示包括后代表。alias
目标表的替代名称。提供别名时,它会完全隐藏表的实际名称。例如,给定
DELETE FROM foo AS f
,DELETE
语句的其余部分必须将此表引用为f
,而不是foo
。from_item
允许其他表中的列出现在
WHERE
条件中的表表达式。这使用与SELECT
语句的FROM
子句相同的语法;例如,可以指定表名的别名。不要将目标表重复为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
中列出的表(s) 的任何列名。编写*
以返回所有列。output_name
用于返回列的名称。
输出
成功完成后,DELETE
命令会返回以下形式的命令标记
DELETE count
*count
是已删除的行数。请注意,当BEFORE DELETE
触发器禁止删除时,该数字可能小于与condition
匹配的行数。如果count
*为 0,则该查询未删除任何行(这不被视为错误)。
如果DELETE
命令包含RETURNING
子句,则结果将类似于SELECT
语句,其中包含RETURNING
列表中定义的列和值,这些列和值是通过该命令删除的行计算得出的。
注释
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');
在某些情况下,连接样式比子选择样式更容易编写或执行速度更快。
示例
删除所有非音乐电影
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;
兼容性
此命令符合SQL标准,但USING
和RETURNING
子句是PostgreSQL扩展,并且可以使用WITH
与DELETE
一起使用。