# 删除

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

# 描述

删除删除满足在哪里来自指定表的子句。如果在哪里子句不存在,效果是删除表中的所有行。结果是一个有效但为空的表。

# 提示

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

使用数据库中其他表中包含的信息删除表中的行有两种方法:使用子选择,或在使用条款。哪种技术更合适取​​决于具体情况。

可选的返回条款原因删除根据实际删除的每一行计算并返回值。使用表的列和/或中提到的其他表的列的任何表达式使用, 可以计算。的语法返回列表与输出列表的列表相同选择.

你必须拥有删除表上删除它的权限,以及选择任何表的权限使用子句或其值在*健康)状况*.

# 参数

with_query

子句允许您指定一个或多个子查询,这些子查询可以在删除询问。看第 7.8 节选择详情。

表名

要从中删除行的表的名称(可选模式限定)。如果只要在表名之前指定,匹配的行仅从命名表中删除。如果只要如果未指定,匹配的行也会从从命名表继承的任何表中删除。可选地,*可以在表名之后指定以明确指示包含后代表。

别名

目标表的替代名称。提供别名时,它会完全隐藏表的实际名称。例如,给定从 foo 中删除为 f,其余的删除声明必须将此表称为f不是.

from_item

允许其他表中的列出现在表中的表表达式在哪里健康)状况。这使用与a的从句选择陈述;例如,可以指定表名的别名。不要将目标表重复为*from_item除非您希望设置自联接(在这种情况下,它必须在from_item*)。

(健康)状况

返回类型值的表达式布尔值.仅此表达式返回的行真的将被删除。

游标名

在 a 中使用的游标名称当前位置健康)状况。要删除的行是最近从该游标中获取的行。游标必须是非分组查询删除的目标表。注意当前位置不能与布尔条件一起指定。看宣布有关使用游标的更多信息当前位置.

输出表达式

要计算并返回的表达式删除删除每一行后的命令。表达式可以使用名为的表的任何列名*表名*或表中列出使用.写*返回所有列。

输出名称

用于返回列的名称。

# 输出

成功完成后,一个删除命令返回形式的命令标签

DELETE count

这*数数是删除的行数。请注意,该数字可能小于匹配的行数健康)状况当删除被删除前扳机。如果数数*为 0,查询没有删除任何行(这不被视为错误)。

如果删除命令包含一个返回子句,结果将类似于选择包含在返回列表,根据命令删除的行计算。

# 笔记

PostgreSQL 允许你引用其他表的列在哪里通过指定其他表中的条件使用条款。例如,要删除给定制片人制作的所有电影,可以执行以下操作:

DELETE FROM films USING producers
  WHERE producer_id = producers.id AND producers.name = 'foo';

这里本质上发生的是电影生产者, 全部成功加入电影被标记为删除的行。这种语法不是标准的。一个更标准的方法是:

DELETE FROM films
  WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');

在某些情况下,连接样式比子选择样式更容易编写或执行更快。

# 例子

删除除音乐剧以外的所有电影:

DELETE FROM films WHERE kind <> 'Musical';

清桌子电影

DELETE FROM films;

删除已完成的任务,返回已删除行的完整详细信息:

DELETE FROM tasks WHERE status = 'DONE' RETURNING *;

删除行任务光标在哪个c_tasks目前定位:

DELETE FROM tasks WHERE CURRENT OF c_tasks;

# 兼容性

此命令符合 SQL 标准,除了使用返回子句是 PostgreSQL 扩展,使用的能力也是如此删除.

# 也可以看看

截短