DELETE

Name

DELETE -- 删除一个表中的行

Synopsis

DELETE FROM [ ONLY ] table [ WHERE condition ]

描述

DELETE 从指明的表里删除满足 WHERE 子句的行。 如果 WHERE 子句不存在, 效果是删除表中所有行。结果是一个有效的空表。

提示: TRUNCATE 是一个 PostgreSQL 扩展, 它提供一个更快的从表中删除所有行的机制。

缺省时 DELETE 将删除所声明的表和所有它的子表的记录。 如果你希望只更新提到的表,你应该使用 ONLY 子句。

要对表进行删除,你必须对它有 DELETE 权限, 同样也必须有 SELECT 的权限,这样才能对符合 condition 的值进行读取操作。

参数

table

一个现存表的名字(可以有模式修饰)。

condition

一个返回 boolean 类型值的值表达式,它判断哪些行需要被删除。

输出

成功时,DELETE 命令返回形如

DELETE count

的标签。 count 是被删除的行数。 如果 count 为 0,没有行匹配 condition (这个不认为是错误)。

注意

PostgreSQL 让你在 WHERE 条件里引用其它表的字段。 比如,要删除给出制片商制作的所有电影,我们可以

DELETE FROM films
  WHERE producer_id = producers.id AND producers.name = 'foo';

这里实际发生的事情是在 filmsproducers 之间的一个连接, 然后所有成功连接的 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;
SELECT * FROM films;

兼容性

这条命令遵循 SQL 标准,但是在 WHERE 子句里面引用其它表的能力是 PostgreSQL 的扩展。