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

Outputs

成功完成后,DELETE命令将返回以下形式的命令标签:

DELETE count

如果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

上一章 首页 下一章