Postgresql UPDATE 语句
Postgresql WHERE 子句 

Postgresql DELETE 语句

在 PostgreSQL 数据库中,如果你想要删除数据,你可以使用 DELETE 语句。本章讲讲 delete 的基本用法。

语法格式

[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
    [ USING from_item [, ...] ]
    [ WHERE condition | WHERE CURRENT OF cursor_name ]
    [ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ]


参数说明

  • with_query -- WITH 子句允许您指定一个或多个可在 DELETE 查询中按名称引用的子查询。

  • table_name -- 要从中删除行的表的名称(可选架构限定)。如果在表名之前指定了 ONLY,则仅从命名表中删除匹配的行。如果未指定 ONLY,则还会从从命名表继承的任何表中删除匹配的行。(可选)可以在表名后指定 *,以明确指示包含后代表。

  • alias -- 目标表的替代名称。提供别名后,它会完全隐藏表的实际名称。例如,给定 DELETE FROM foo AS f,则 DELETE 语句的其余部分必须将此表引用为 f 而不是 foo。

  • from_item -- 允许其他表中的列出现在 WHERE 条件中的表表达式。这使用与 SELECT 语句的 FROM 子句相同的语法;例如,可以指定 table name 的别名。除非您希望设置自联接(在这种情况下,它必须在from_item中与别名一起显示),否则不要将目标表作为from_item重复。

  • 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

计数是删除的行数。请注意,该数量可能小于 BEFORE DELETE 触发器抑制删除时与条件匹配的行数。如果 count 为 0,则查询未删除任何行(这不被视为错误)。

如果 DELETE 命令包含 RETURNING 子句,则结果将类似于 SELECT 语句的结果,该语句包含 RETURNING 列表中定义的列和值,根据命令删除的行进行计算。


特别说明

PostgreSQL 允许您通过在 USING 子句中指定其他表来引用 WHERE 条件中其他表的列。例如,删除三二班的所有学生,可以执行以下操作:

DELETE FROM students USING classes
  WHERE class_id = classes.id AND classes.name = '三二班';

上述语句也可以用如下的子查询实现:

DELETE FROM students WHERE class_id in (select class_id from classes where name = '三二班');


使用示例

  • 删除用户表的所有数据

DELETE FROM user;
  • 删除年龄小于 20 的用户

DELETE FROM user where age < 20;
  • 删除用户表的所有数据,并在控制台显示已删除的记录

DELETE FROM user RETURNING *;