DELETE

本文介绍了DELETE语法的简介、使用方法以及示例等内容。

描述

DELETE从指定表中删除满足 WHERE子句的行。如果WHERE 子句没有出现,效果将会是删除表中的所有行。结果是一个合法的空表。

说明

TRUNCATE支持快速移除表中所有行。

有两种方式可以使用数据库中其他表中包含的信息来删除一个表的行: 使用子选择,或者在USING子句中指定额外的表。具体取决于特定的环境。

可选的RETURNING子句导致DELETE 基于实际被删除的每一行计算并且返回值。任何使用被删除表列或者 USING中提到的其他表的列的表达式都可以被计算。 RETURNING列表的语法和SELECT的输出列表语法相同。

要从表中删除行,你必须具有其上的DELETE权限,以及USING子句中任何表以及其值在condition中被读取的表上的SELECT权限。

语法

    [ 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_queryWITH子句允许你指定一个或者多个子查询,在 DELETE查询中可以用子查询的名字来引用它们。

  • table_name要从其中删除行的表名(可以是模式限定的)。如果在表名前指定ONLY,只会从提到的表中删除匹配的行。如果没有指定ONLY,还会删除该表的任何继承表中的匹配行。可选的,可以在表名后面指定来显式指定要包括继承表。

  • alias目标表的别名。提供别名时,它会完全隐藏该表的真实名称。例如, 对于DELETE FROM foo AS fDELETE语句的剩余部分都会用 f而不是foo来引用该表。

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

  • condition:返回boolean类型值的表达式。只有让这个表达式返回true的行才将被删除。

  • cursor_name要在WHERE CURRENT OF情况中使用的游标的名称。最近一次从这个游标中取出的行将被删除。该游标必须是DELETE的目标表上的非分组查询。 注意不能在使用WHERE CURRENT OF的同时指定一个布尔条件。

  • output_expression在行被删除后,会被DELETE计算并且返回的表达式。 该表达式可以使用 table_name 以及USING中的表的任何列。写成可以返回所有列。

  • output_name被返回列的名称。

输出

在成功完成时,DELETE命令会返回以下形式的命令标签:

    DELETE count

count是被删除行的数目。

说明

如果有一个BEFORE DELETE触发器抑制删除,那么该数目可能小于匹配 condition 的行数。如果 count为0, 表示查询没有删除行(这并非一种错误)。

如果DELETE命令包含RETURNING子句, 则结果会与包含有RETURNING列表中定义的列和值的 SELECT语句结果相似,这些结果是在被该命令删除的行上计算得来。

说明

通过在USING子句中指定其他的表,PolarDB允许在WHERE条件中引用其他表的列。例如,要删除给定制片人制作的所有电影,可以执行以下命令:

    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');

在一些情况下,连接形式比子查询形式更容易书写或者执行更快。

示例

删除所有电影,但音乐剧除外:

    DELETE FROM films WHERE kind <> 'Musical';

清空表films

    DELETE FROM films;

删除已完成的任务,返回被删除行的明细:

    DELETE FROM tasks WHERE status = 'DONE' RETURNING *;

删除tasks中游标c_tasks当前位于其上的行:

    DELETE FROM tasks WHERE CURRENT OF c_tasks;