DELETE
更新时间:2026-06-25
DELETE
从表中删除行。
语法
SQL
1 [ WITH [ RECURSIVE ] with_query [, ...] ]
2 DELETE FROM [ONLY] table [[AS] alias]
3 [USING usinglist]
4 [WHERE condition | WHERE CURRENT OF cursor_name]
5 [RETURNING * | output_expression [[AS] output_name] [, …]]
6 ```
7
8
9
10## 描述
11
12`DELETE`从指定的表中删除满足`WHERE`子句的行。 如果`WHERE`子句不存在,则结果是删除表中的所有行。 结果是一个有效但空的表。
13
14 默认情况下,`DELETE`将删除指定表及其所有子表中的行。 如果只希望从提到的特定表中删除,则必须使用`ONLY`子句。
15
16 使用数据库中其他表中包含的信息删除表中的行有两种方法:使用子选择,或在`USING`子句中指定其他表。 哪种技术更合适取决于具体情况。
17
18 如果指定了`WHERE CURRENT OF`子句,则删除的行是从指定游标中最新获取的行。
19
20 复制表不支持`WHERE CURRENT OF`子句。
21
22 可选的`RETURNING`子句使`DELETE`根据实际删除的每一行计算并返回值。可以计算使用该表的列和(或)`USING`中提到的其他表的列的任何表达式。`RETURNING`列表的语法与`SELECT`的输出列表的语法相同。
23
24 必须对表具有`DELETE`权限才能从中删除。
25
26
27 注意:默认情况下,PalopgMPP数据库为堆表上的`DELETE`操作获取表上的`EXCLUSIVE`锁。启用全局死锁检测器后,堆表上`DELETE`操作的锁定模式为`ROW EXCLUSIVE`。
28
29
30
31
32 **输出**
33
34 成功完成后,`DELETE`命令将返回以下形式的命令标签:
35
36 ``` sql
37 DELETE count
38 ```
39
40 `count`是已删除的行数。 如果`count`为0,则查询没有删除任何行(这不视为错误)。
41
42 如果`DELETE`命令包含`RETURNING`子句,则结果将类似于`SELECT`语句的结果,该`SELECT`语句包含`RETURNING`列表中定义的列和值,该列和值是在该命令删除的行上计算的。
43
44
45
46
47## 参数
48
49该SQL命令参数说明见下
50
51 `with_query`
52 : `WITH`子句允许您指定一个或多个子查询,这些子查询可以在`DELETE`查询中按名称引用。
53
54 对于包含`WITH`子句的`DELETE`命令,该子句只能包含`SELECT`语句, 而`WITH`子句不能包含数据修改命令(`INSERT`,`UPDATE`或`DELETE`)。WITH子句提供在一个更大的SELECT查询中,使用子查询或执行数据修改操作的方式。你可以在INSERT, UPDATE, 或 DELETE 命令中使用WITH子句。
55
56 `ONLY`
57 : 如果指定,则仅从命名表中删除行。 如果未指定,还将处理从命名表继承的任何表。
58
59 `table`
60 : 现有表的名称(可以用模式指定)。
61
62 `alias`
63 : 目标表的替代名称。提供别名后,它将完全隐藏表的实际名称。 例如,给定`DELETE FROM foo AS f`,`DELETE`语句的其余部分必须将此表称为`f`而不是`foo`。
64
65 `usinglist`
66 : 表表达式的列表,允许其他表中的列以`WHERE`条件出现。 这类似于可以在`SELECT`语句的`FROM`子句中指定的表的列表。例如,可以指定表名的别名。 除非您希望设置自连接,否则不要在`usinglist`中重复目标表。
67
68 `condition`
69 : 该表达式返回一个布尔类型的值,该值确定要删除的行。
70
71 `cursor_name`
72 : 在`WHERE CURRENT OF`条件中使用的游标名称。 要删除的行是从该游标中最近获取的行。游标必须是对`DELETE`目标表的简单非分组查询。不能与布尔条件一起指定`WHERE CURRENT OF`。
73
74 游标语句的`DELETE...WHERE CURRENT OF`游标语句只能在服务器上执行,例如在交互式ssql会话或脚本中。语言扩展(例如PL/pgSQL)不支持可更新的游标。
75
76 `output_expression`
77 : 删除每一行后,由`DELETE`命令计算并返回的表达式。 该表达式可以使用在`USING`中列出的一个或多个表的任何列名。输入\*以返回所有列。
78
79 `output_name`
80 : 用于返回的列的名称。
81
82
83
84注解
85: PalopgMPP数据库允许您通过在`USING`子句中指定其他表来引用`WHERE`条件下其他表的列。例如,从`rank`表中将其命名为`Hannah`,可以这样做:
86
87 ``` sql
88 DELETE FROM rank USING names WHERE names.id = rank.id AND
89 name = 'Hannah';
90 ```
91
92 这里实际上发生的是`rank`和`names`之间的联接,所有成功联接的行都标记为删除。此语法不是标准语法。但是,这种连接样式通常比更标准的子选择样式更易于编写和执行,例如:
93
94 ``` sql
95 DELETE FROM rank WHERE id IN (SELECT id FROM names WHERE name
96 = 'Hannah');
97 ```
98
99 当使用`DELETE`删除表的所有行时(例如:`DELETE * FROM table;`),PalopgMPP数据库会添加一个隐式的`TRUNCATE`命令(当用户权限允许时)。添加的`TRUNCATE`命令释放被删除的行占用的磁盘空间,而无需对表进行`VACUUM`。这提高了后续查询的扫描性能,并使经常在临时表中插入和删除的ELT工作负载受益。
100
101 不支持在分区表的特定分区(子表)上直接执行`UPDATE`和`DELETE`命令。 而是必须在根分区表(使用`CREATE TABLE`命令创建的表)上执行这些命令。
102
103
104
105## 示例
106
107删除除musicals以外的所有films:
108
109 ``` sql
110 DELETE FROM films WHERE kind <> 'Musical';
111 ```
112
113 清除表films:
114
115 ``` sql
116 DELETE FROM films;
117 ```
118
119
120 删除已完成的任务,返回已删除行的完整详细信息:
121
122 ``` sql
123 DELETE FROM tasks WHERE status = 'DONE' RETURNING *;
124 ```
125
126
127 使用联接删除:
128
129 ``` sql
130 DELETE FROM rank USING names WHERE names.id = rank.id AND
131 name = 'Hannah';
132 ```
133
134
135
136兼容性说明
137: 该命令符合SQL标准,不同之处在于`USING`和`RETURNING`子句是PalopgMPP数据库扩展,以及将`WITH`和`DELETE`一起使用的功能。
138
139
140
141相关SQL命令
142: `DECLARE`, `TRUNCATE`
评价此篇文章
