DELETE
从表中删除行。
概要
[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ONLY] table [[AS] alias]
[USING usinglist]
[WHERE condition | WHERE CURRENT OF cursor_name]
[RETURNING * | output_expression [[AS] output_name] [, …]]
描述
DELETE
从指定的表中删除满足WHERE
子句的行。
如果WHERE
子句不存在,则结果是删除表中的所有行。
结果是一个有效但空的表。
默认情况下,DELETE
将删除指定表及其所有子表中的行。
如果只希望从提到的特定表中删除,则必须使用ONLY
子句。
使用数据库中其他表中包含的信息删除表中的行有两种方法:使用子选择,或在USING
子句中指定其他表。
哪种技术更合适取决于具体情况。
如果指定了WHERE CURRENT OF
子句,则删除的行是从指定游标中最新获取的行。
复制表不支持WHERE CURRENT OF
子句。
可选的RETURNING
子句使DELETE
根据实际删除的每一行计算并返回值。
可以计算使用该表的列和/或USING
中提到的其他表的列的任何表达式。
RETURNING
列表的语法与SELECT
的输出列表的语法相同。
您必须对表具有DELETE
特权才能从中删除。
Note: 默认情况下,Greenplum数据库为堆表上的DELETE
操作获取表上的EXCLUSIVE
锁。
启用全局死锁检测器后,堆表上DELETE
操作的锁定模式为ROW EXCLUSIVE
。
请参阅全局死锁检测。
输出
成功完成后,DELETE
命令将返回以下形式的命令标签:
DELETE count
count是已删除的行数。 如果count为0,则查询没有删除任何行(这不视为错误)。
如果DELETE
命令包含RETURNING
子句,则结果将类似于SELECT
语句的结果,
该SELECT
语句包含RETURNING
列表中定义的列和值,该列和值是在该命令删除的行上计算的。
参数
with_query
WITH
子句允许您指定一个或多个子查询,这些子查询可以在DELETE
查询中按名称引用。
对于包含WITH
子句的DELETE
命令,该子句只能包含SELECT
语句,
而WITH
子句不能包含数据修改命令(INSERT
,UPDATE
或DELETE
)。
请参见WITH查询(公用表表达式)和[SELECT](SELECT.html#topic1)
获取详细信息。
ONLY 如果指定,则仅从命名表中删除行。 如果未指定,还将处理从命名表继承的任何表。
table
现有表的名称(可以用模式指定)。
alias
目标表的替代名称。提供别名后,它将完全隐藏表的实际名称。
例如,给定DELETE FROM foo AS f
,DELETE
语句的其余部分必须将此表称为f
而不是foo
。
usinglist
表表达式的列表,允许其他表中的列以WHERE
条件出现。
这类似于可以在[SELECT](SELECT.html#topic1)
语句的FROM
子句中指定的表的列表。
例如,可以指定表名的别名。
除非您希望设置自连接,否则不要在usinglist
中重复目标表。
condition
该表达式返回一个布尔类型的值,该值确定要删除的行。
cursor_name
在WHERE CURRENT OF
条件中使用的游标名称。
要删除的行是从该游标中最近获取的行。
游标必须是对DELETE
目标表的简单非分组查询。
不能与布尔条件一起指定WHERE CURRENT OF
。
游标语句的DELETE...WHERE CURRENT OF
游标语句只能在服务器上执行,例如在交互式psql会话或脚本中。
语言扩展(例如PL/pgSQL)不支持可更新的游标。
有关创建游标的更多信息,请参见[DECLARE](DECLARE.html#topic1)
。
output_expression
删除每一行后,由DELETE
命令计算并返回的表达式。
该表达式可以使用在USING
中列出的一个或多个表的任何列名。
输入*以返回所有列。
output_name 用于返回的列的名称。
注解
Greenplum数据库允许您通过在USING
子句中指定其他表来引用WHERE
条件下其他表的列。
例如,从rank
表中将其命名为Hannah
,可以这样做:
DELETE FROM rank USING names WHERE names.id = rank.id AND
name = 'Hannah';
这里实际上发生的是rank
和names
之间的联接,所有成功联接的行都标记为删除。
此语法不是标准语法。但是,这种连接样式通常比更标准的子选择样式更易于编写和执行,例如:
DELETE FROM rank WHERE id IN (SELECT id FROM names WHERE name
= 'Hannah');
当使用DELETE
删除表的所有行时(例如:DELETE * FROM table;
),
Greenplum数据库会添加一个隐式的TRUNCATE
命令(当用户权限允许时)。
添加的TRUNCATE
命令释放被删除的行占用的磁盘空间,而无需对表进行VACUUM
。
这提高了后续查询的扫描性能,并使经常在临时表中插入和删除的ELT工作负载受益。
不支持在分区表的特定分区(子表)上直接执行UPDATE
和DELETE
命令。
而是必须在根分区表(使用CREATE TABLE
命令创建的表)上执行这些命令。
示例
删除除musicals以外的所有films:
DELETE FROM films WHERE kind <> 'Musical';
清除表films:
DELETE FROM films;
删除已完成的任务,返回已删除行的完整详细信息:
DELETE FROM tasks WHERE status = 'DONE' RETURNING *;
使用联接删除:
DELETE FROM rank USING names WHERE names.id = rank.id AND
name = 'Hannah';
兼容性
该命令符合SQL标准,不同之处在于USING
和RETURNING
子句是Greenplum数据库扩展,
以及将WITH
和DELETE
一起使用的功能。
另见
[DECLARE](DECLARE.html#topic1)
,
[TRUNCATE](TRUNCATE.html#topic1)
Parent topic: SQL Command Reference