DELETE

Name

DELETE -- 删除一个表中的行

Synopsis

DELETE FROM [ ONLY ] table
    [ USING usinglist ]
    [ WHERE condition ]

描述

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

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

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

使用数据库中其他表的信息删除某个表中的数据行有两个办法: 使用子查询,或者在 USING 子句中声明额外的表。 哪种技巧更合适取决于特定的环境。

要对表进行删除,你必须对它有 DELETE 权限, 同样也必须有 USING 子句的表以及 condition 上读取的表的 SELECT 的权限。

参数

ONLY

如果声明了这个选项,则只从指定的表中删除数据行。 如果没有声明,则任何从指定的表继承的表中的数据行也会被处理。

table

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

usinglist

一个表表达式的列表,允许在 WHERE 条件里出现其他表。 这个类似于一列可以在 SELECT 语句里声明的 FROM 子句; 比如,可以为改表的名字声明一个别名。 不要在 usinglist 里重复目标表,除非你希望产生一个自连接。

condition

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

输出

成功时,DELETE 命令返回形如

DELETE count

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

注意

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

DELETE FROM films USING producers
  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 标准,但是 USING 子句和在 WHERE 子句里面引用其它表的能力是 PostgreSQL 的扩展。