删除 - Amazon Redshift

删除

从表中删除行。

注意

单个 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;