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.8SELECT
  • 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';

这里实际上发生的是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 扩展,以及将WITHDELETE结合使用的能力。

See Also

TRUNCATE