DELETE
DELETE¶
从表中删除行。
- 语法
sql [ 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权限才能从中删除。注意:默认情况下,SeaboxMPP数据库为堆表上的
DELETE操作获取表上的EXCLUSIVE锁。启用全局死锁检测器后,堆表上DELETE操作的锁定模式为ROW EXCLUSIVE。输出
成功完成后,
DELETE命令将返回以下形式的命令标签:DELETE countcount是已删除的行数。 如果count为0,则查询没有删除任何行(这不视为错误)。如果
DELETE命令包含RETURNING子句,则结果将类似于SELECT语句的结果,该SELECT语句包含RETURNING列表中定义的列和值,该列和值是在该命令删除的行上计算的。 - 参数
-
该SQL命令参数说明见下
with_query-
WITH子句允许您指定一个或多个子查询,这些子查询可以在DELETE查询中按名称引用。对于包含
WITH子句的DELETE命令,该子句只能包含SELECT语句, 而WITH子句不能包含数据修改命令(INSERT,UPDATE或DELETE)。WITH子句提供在一个更大的SELECT查询中,使用子查询或执行数据修改操作的方式。你可以在INSERT, UPDATE, 或 DELETE 命令中使用WITH子句。 ONLY- 如果指定,则仅从命名表中删除行。 如果未指定,还将处理从命名表继承的任何表。
table- 现有表的名称(可以用模式指定)。
alias- 目标表的替代名称。提供别名后,它将完全隐藏表的实际名称。 例如,给定
DELETE FROM foo AS f,DELETE语句的其余部分必须将此表称为f而不是foo。 usinglist- 表表达式的列表,允许其他表中的列以
WHERE条件出现。 这类似于可以在SELECT语句的FROM子句中指定的表的列表。例如,可以指定表名的别名。 除非您希望设置自连接,否则不要在usinglist中重复目标表。 condition- 该表达式返回一个布尔类型的值,该值确定要删除的行。
cursor_name-
在
WHERE CURRENT OF条件中使用的游标名称。 要删除的行是从该游标中最近获取的行。游标必须是对DELETE目标表的简单非分组查询。不能与布尔条件一起指定WHERE CURRENT OF。游标语句的
DELETE...WHERE CURRENT OF游标语句只能在服务器上执行,例如在交互式ssql会话或脚本中。语言扩展(例如PL/pgSQL)不支持可更新的游标。 output_expression- 删除每一行后,由
DELETE命令计算并返回的表达式。 该表达式可以使用在USING中列出的一个或多个表的任何列名。输入*以返回所有列。 output_name- 用于返回的列的名称。
- 注解
-
SeaboxMPP数据库允许您通过在
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;),SeaboxMPP数据库会添加一个隐式的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子句是SeaboxMPP数据库扩展,以及将WITH和DELETE一起使用的功能。 - 相关SQL命令
DECLARE,TRUNCATE