DELETE
DELETE - 删除表的行
语法格式
[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
[ USING using_list ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
说明
DELETE从指定表中删除满足 WHERE子句的行。如果WHERE 子句没有出现,效果将会是删除表中的所有行。结果是一个合法的空表。
有两种方式可以使用数据库中其他表中包含的信息来删除一个表的行: 使用子选择或者在USING子句中指定额外的表。 哪种技术更合适取决于特定的环境。
可选的RETURNING子句导致DELETE 基于实际被删除的每一行计算并且返回值。任何使用被删除表列或者 USING中提到的其他表的列的表达式都可以被计算。 RETURNING列表的语法和SELECT的 输出列表语法相同。
要从表中删除行,你必须具有其上的DELETE特权, 以及USING子句中任何表以及其值在condition中被读取的表上的 SELECT特权。
参数说明
with_query
WITH子句允许你指定一个或者多个子查询,在 DELETE查询中可以用子查询的名字来引用它们。
table_name
要从其中删除行的表名(可以是模式限定的)。如果在表名前指定 ONLY,只会从提到的表中删除匹配的行。如果没有指定 ONLY,还会删除该表的任何继承表中的匹配行。可选地, 可以在表名后面指定*来显式指定要包括继承表。
alias
目标表的一个别名。提供别名时,它会完全隐藏该表的真实名称。例如, 对于DELETE FROM foo AS f, DELETE语句的剩余部分都会用 f而不是 foo来引用该表。
using_list
一个表表达式的列表,它允许在WHERE条件中出现 来自其他表的列。这和SELECT语句 的FROM 子句中指定 的表列表相似。例如,可以指定表的别名。除非想要进行自连接, 否则不要在using_list 再写上目标表。
condition
一个返回boolean类型值的表达式。只有让这个 表达式返回true的行才将被删除。
cursor_name
要在WHERE CURRENT OF情况中使用的游标 的名称。最近一次从这个游标中取出的行将被删除。该游标 必须是DELETE的目标表上的非分组查询。 注意不能在使用WHERE CURRENT OF的同时 指定一个布尔条件。有关将游标用于 WHERE CURRENT OF的更多信息请见 DECLARE。
output_expression
在每一行被删除后,会被DELETE计算并且返回的表达式。 该表达式可以使用table_name 以及USING中的表的任何列。写成*可以返回所有列。
output_name
被返回列的名称。
输出
成功完成后, DELETE 命令将返回表单的命令标记
DELETE count
count是被删除行的数目。 注意如果有一个BEFORE DELETE触发器抑制删除,那么该数目 可能小于匹配condition 的行数。如果count为 0, 表示查询没有删除行(这并非一种错误)。
如果DELETE命令包含RETURNING子句, 则结果会与包含有RETURNING列表中定义的列和值的 SELECT语句结果相似,这些结果是在被该命令删除的 行上计算得来。
注意事项
Vastbase E100允许您通过指定 USING 子句中的其他表来引用 WHERE条件中其他表的列。例如,要删除由给定制作人制作的所有电影,可以执行以下操作:
DELETE FROM films USING producers
WHERE producer_id = producers.id AND producers.name = 'foo';
这里实际发生的是 films 和 producers 之间的连接,所有成功连接的 films行都被标记为删除。此语法不是标准语法。更标准的方法是:
DELETE FROM films
WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');
在某些情况下,连接样式比子选择样式更容易编写或执行更快。
示例
删除所有电影,但删除音乐剧:
DELETE FROM films WHERE kind <> 'Musical';
清除表 films :
DELETE FROM films;
删除已完成的任务,返回已删除行的完整详细信息:
DELETE FROM tasks WHERE status = 'DONE' RETURNING *;
删除光标 c_tasks 当前所在的 tasks 行:
DELETE FROM tasks WHERE CURRENT OF c_tasks;