删除
从表中删除行。
注意
单个 SQL 语句的最大大小为 16MB。
语法
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] DELETE [ FROM ] { table_name | materialized_view_name } [ { USING } table_name, ... ] [ WHERE condition ]
参数
- WITH 子句
可选子句,指定一个或多个 common-table-expressions。请参阅 WITH 子句。
- FROM
-
FROM 关键字是可选的,不过在指定 USING 子句时除外。语句
delete from event;
和delete event;
执行相同的操作,可从 EVENT 表中删除所有行。注意
要从表中删除所有行,请对表执行 TRUNCATE。TRUNCATE 的效率要比 DELETE 高很多,不需要 VACUUM 和 ANALYZE。不过请注意,TRUNCATE 在其运行的事务中提交事务。
- table_name
-
一个临时或永久表。只有表的所有者或对表具有 DELETE 权限的用户才能从表中删除行。
考虑对大型表使用 TRUNCATE 命令来快速执行非限定的删除操作;请参阅 TRUNCATE。
注意
在从表中删除大量行之后:
-
对表执行 Vacuum 操作,以回收存储空间并对行重新排序。
-
分析表以更新查询计划程序的统计数据。
-
- materialized_view_name
-
实体化视图。DELETE 语句适用于用于流式摄取到实体化视图的实体化视图。只有实体化视图的所有者或对实体化视图具有 DELETE 权限的用户才能从中删除行。
如果行级别安全性 (RLS) 策略未向用户授予 IGNORE RLS 权限,则您无法在用于流式摄取的实体化视图上运行 DELETE。但有一个例外:如果向执行 DELETE 操作的用户授予了 IGNORE RLS,则此操作会成功运行。有关更多信息,请参阅 RLS 策略拥有权和管理。
- USING table_name, ...
-
在 WHERE 子句条件中引用附加表时,使用 USING 关键字可以引入表列表。例如,以下语句从 EVENT 表中删除满足 EVENT 和 SALES 表上的联接条件的所有行。必须在 FROM 列表中明确指定 SALES 表:
delete from event using sales where event.eventid=sales.eventid;
如果您在 USING 子句中重复目标表名称,DELETE 操作将运行自联接。您可以在 WHERE 子句中使用子查询,以取代 USING 语法来编写相同的查询。
- WHERE condition
-
一个限制只删除那些符合条件的行的可选子句。例如,条件可以是对列的限制,也可以是联接条件或基于查询结果的条件。查询可以引用 DELETE 命令的目标以外的其他表。例如:
delete from t1 where col1 in(select col2 from t2);
如果未指定条件,将删除表中的所有行。
示例
从 CATEGORY 表中删除所有行:
delete from category;
从 CATEGORY 表中删除 CATID 值在 0 与 9 之间的行:
delete from category where catid between 0 and 9;
从 LISTING 表中删除其 SELLERID 值在 SALES 表中不存在的行:
delete from listing where listing.sellerid not in(select sales.sellerid from sales);
以下两个查询均根据与 EVENT 表的联接以及 CATID 列的额外限制,从 CATEGORY 表中删除一行:
delete from category using event where event.catid=category.catid and category.catid=9;
delete from category where catid in (select category.catid from category, event where category.catid=event.catid and category.catid=9);
以下查询从 mv_cities
实体化视图中删除所有行。此示例中的实体化视图名称是一个示例:
delete from mv_cities;