# 删除
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 扩展,使用的能力也是如此和
和删除
.