DELETE 从指明的表里删除满足 WHERE 子句的行。 如果 WHERE 子句不存在, 效果是删除表中所有行。结果是一个有效的空表。
提示: TRUNCATE 是一个 PostgreSQL 扩展, 它提供一个更快的从表中删除所有行的机制。
缺省时 DELETE 将删除所声明的表和所有它的子表的记录。 如果你希望只更新提到的表,你应该使用 ONLY 子句。
要对表进行删除,你必须对它有 DELETE 权限, 同样也必须有 SELECT 的权限,这样才能对符合 condition 的值进行读取操作。
PostgreSQL 让你在 WHERE 条件里引用其它表的字段。 比如,要删除给出制片商制作的所有电影,我们可以
DELETE FROM films 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');
有时候连接风格比子查询风格更容易写或者执行更快。 一个反对连接风格的意见是,在查询里没有明确地列出使用哪些表, 这样就令这种风格比较容易出错;并且它也无法处理自连接。