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

Description

DELETE 从指定表中删除满足 WHERE 子句的行。如果 WHERE 子句不存在,则删除表中的所有行。结果是一个有效但为空的表。

Tip

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

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

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

您必须对要从中删除行的表具有 DELETE 特权,以及 USING 子句中或在 condition 中读取其值的任何表的 SELECT 特权。

Parameters

  • 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 不能与布尔条件一起指定。有关将游标与 WHERE CURRENT OF 一起使用的更多信息,请参见 DECLARE

  • output_expression

    • 在每行删除后由 DELETE 命令计算并返回的表达式。该表达式可以使用 table_name 命名的表或 USING 中列出的表(多个) 的任何列名。编写 * 以返回所有列。

  • output_name

    • 用于返回列的名称。

Outputs

成功完成后, DELETE 命令会返回以下形式的命令标记

DELETE count

count 是删除的行数。注意,当删除操作被 BEFORE DELETE 触发器禁止时,此数字可能小于与 condition 匹配的行数。如果 count 为 0,则该查询未删除任何行(这不会视为错误)。

如果 DELETE 命令包含一个 RETURNING 子句,则结果将类似于包含由命令删除的行上计算得出的 RETURNING 列表中定义的列和值,且包含 SELECT 语句的结果。

Notes

通过在 USING 子句中指定其他表,PostgreSQL 允许您在 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');

在某些情况下,联接类型比子选择类型更易于编写或执行速度更快。

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 标准,但 USINGRETURNING 子句是 PostgreSQL 扩展,而且可以在 DELETE 中使用 WITH 的功能也是 PostgreSQL 扩展。

See Also