©
This document uses PHP Chinese website manual Release
DELETE FROM [ ONLY ] table [ [ AS ] alias ] [ USING using_list ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
DELETE从指定的表里删除满足WHERE子句的行。 如果WHERE子句不存在,将删除表中所有行。结果是一个有效的空表。
Tip: TRUNCATE 是一个PostgreSQL扩展, 它提供一个更快的从表中删除所有行的机制。
缺省时DELETE将删除所声明的表及其所有子表的记录。如果你希望只删除指定的表, 你应该使用ONLY子句。
使用数据库中其它表的信息删除某个表中的数据行有两个办法:使用子查询, 或者在USING子句中声明额外的表。哪种技巧更合适取决于特定的环境。
可选的RETURNING子句将使得DELETE计算并返回实际被删除了的行。 任何使用表字段的表达式和/或USING中提到的其他表的字段,都可以用于计算。 RETURNING列表的语法和SELECT输出列表的语法相同。
要对表进行删除,你必须对它有DELETE权限, 同样也必须有USING子句的表以及condition 上读取的表的SELECT权限。
如果声明了这个选项,则只从指定的表中删除数据行。否则从指定的表及其所有子表中的删除。
一个现存表的名字(可以有模式修饰)
目标表的别名。如果提供了别名,那么它将完全掩盖实际的表名。例如给定DELETE FROM foo AS f之后,DELETE语句的剩余部分必须使用f而不是foo来引用该表。
表表达式列表,允许来自其他表的列出现在WHERE条件中。这与可以在SELECT命令的FROM子句子句 中指定的表列表相似。例如,可以为该表的名字声明一个别名。不要在using_list里重复目标表,除非你希望产生一个自连接。
返回一个boolean类型值的表达式。仅仅对于表达式返回true的行进行删除。
在WHERE CURRENT OF环境下使用的游标的名称。要删除的行是一个最近从这个游标 获取的。游标必须是DELETE目标表上的一个非分组查询。请注意: WHERE CURRENT OF不能与一个布尔类型一同声明。请参阅DECLARE 获取更多关于使用带WHERE CURRENT OF的游标的更多详细信息。
在每行删除后,通过DELETE命令来计算和返回的表达式。表达式可以使用 table的任意列名或者USING中 列出的任意表。写*来返回所有列。
用于返回列的一个名称。
成功时,DELETE 命令返回形如
DELETE count
count是被删除的行数。如果为 0 则表示没有行匹配 condition,这个不认为是错误。
如果DELETE命令包含一个RETURNING子句,那么其结果非常类似于 SELECT语句基于RETURNING子句中包含的字段和值列表的结果, 只是基于被删除的行进行计算而已。
PostgreSQL允许你在WHERE条件里引用其它表的字段, 方法是在USING子句里声明其它表。比如,要删除给出制片商制作的所有电影, 可以这样做:
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');
有时候连接风格比子查询风格更容易写或者执行更快。
删除所有电影(films)但不删除音乐(musicals):
DELETE FROM films WHERE kind <> 'Musical';
清空films表:
DELETE FROM films;
从 tasks 表及其子表中删除,并返回所有被删除的行:
DELETE FROM tasks WHERE status = 'DONE' RETURNING *;
删除tasks的行,游标当前就放置在c_tasks上:
DELETE FROM tasks WHERE CURRENT OF c_tasks;
这条命令遵循SQL标准,但是USING和RETURNING 子句是PostgreSQL的扩展。