选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

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 ] } [, ...] ]

描述

DELETE从指定表中删除满足 WHERE子句的行。如果省略WHERE 子句,效果就是删除表中的所有行。结果是一个合法但为空的表。

Tip

TRUNCATE提供了一种更快的机制来移除表中的所有行。

有两种方法可以利用数据库中其他表所包含的信息来删除一个表中的行: 使用子选择,或者在USING子句中指定附加表。 哪种技术更合适取决于具体情况。

可选的RETURNING子句使DELETE 基于每个实际被删除的行计算并返回一个或多个值。可以计算使用该表 列和/或USING中提到的其他表列的任意表达式。 RETURNING列表的语法与SELECT 的输出列表相同。

要从一个表中删除行,必须具有该表上的DELETE权限, 以及USING子句中出现的任何表或者其值会在 condition中读取的任 何表上的SELECT权限。

参数

with_query

WITH子句允许你指定一个或多个子查询,这些子查 询可在DELETE查询中按名称引用。详见 Section 7.8SELECT

table_name

要从中删除行的表名(可以是模式限定的)。如果在表名前指定了 ONLY,只会从所提及表中删除匹配行。如果未指定 ONLY,还会删除继承自该表的任何表中的匹配行。 可选地,可以在表名后指定*,以显式指示包含后代 表。

alias

目标表的替代名称。提供别名时,它会完全隐藏该表的实际名称。 例如,给定DELETE FROM foo AS fDELETE语句的其余部分必须将该表称为 f,而不是foo

from_item

一个表表达式,允许其他表的列出现在WHERE条件 中。这里使用的语法与SELECT语句的 FROM子句相同; 例如,可以为表名指定别名。除非你打算进行自连接(这种情况下它 必须在from_item中带有别名出现),否 则不要把目标表重复写成from_item

condition

一个返回boolean类型值的表达式。只有使这个表达式返 回true的行才会被删除。

cursor_name

WHERE CURRENT OF条件中使用的游标名称。要删除的行是最近从该游标取出的那一行。该游标必须是针对DELETE目标表的非分组查询。注意,WHERE CURRENT OF不能与布尔条件一起指定。有关游标使用的更多信息,请参阅DECLARE中关于WHERE CURRENT OF的说明。

output_expression

每行删除之后,由DELETE命令计算并返回的表达式。该表达式可以使用table_name所指定的表或USING中列出的表中的任何列名。写成*可返回所有列。

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';

本质上,这里发生的是在filmsproducers之间进行连接,并将所有成功连接 到的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标准,不过 USINGRETURNING子句是 PostgreSQL扩展,在 DELETE中使用WITH也是扩展。

另见

TRUNCATE