

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# DELETE
<a name="r_DELETE"></a>

从表中删除行。

**注意**  
单个 SQL 语句的最大大小为 16MB。

## 语法
<a name="r_DELETE-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
DELETE [ FROM ] { table_name | materialized_view_name }
    [ { USING } table_name, ... ]
    [ WHERE condition ]
```

## 参数
<a name="r_DELETE-parameters"></a>

WITH 子句  
可选子句，指定一个或多个 *common-table-expressions*。请参阅 [WITH 子句](r_WITH_clause.md)。

FROM  
FROM 关键字是可选的，不过在指定 USING 子句时除外。语句 `delete from event;` 和 `delete event;` 执行相同的操作，可从 EVENT 表中删除所有行。  
要从表中删除所有行，请对表执行 [TRUNCATE](r_TRUNCATE.md)。TRUNCATE 的效率要比 DELETE 高很多，不需要 VACUUM 和 ANALYZE。不过请注意，TRUNCATE 在其运行的事务中提交事务。

 *table\$1name*   
一个临时或永久表。只有表的所有者或对表具有 DELETE 权限的用户才能从表中删除行。  
考虑对大型表使用 TRUNCATE 命令来快速执行非限定的删除操作；请参阅 [TRUNCATE](r_TRUNCATE.md)。  
在从表中删除大量行之后：  
+ 对表执行 Vacuum 操作，以回收存储空间并对行重新排序。
+ 分析表以更新查询计划程序的统计数据。

 *materialized\$1view\$1name*   
实体化视图。DELETE 语句适用于用于[流式摄取到实体化视图](materialized-view-streaming-ingestion.md)的实体化视图。只有实体化视图的所有者或对实体化视图具有 DELETE 权限的用户才能从中删除行。  
如果行级别安全性 (RLS) 策略未向用户授予 IGNORE RLS 权限，则您无法在用于流式摄取的实体化视图上运行 DELETE。但有一个例外：如果向执行 DELETE 操作的用户授予了 IGNORE RLS，则此操作会成功运行。有关更多信息，请参阅 [RLS 策略拥有权和管理](https://docs.aws.amazon.com/redshift/latest/dg/t_rls_ownership.html)。

USING *table\$1name*, ...  
在 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);
```
如果未指定条件，将删除表中的所有行。

## 使用说明
<a name="r_DELETE-usage"></a>
+ DELETE 操作在连接到以下任何一项的 Amazon Redshift 流式传输实体化视图上运行时，将持有排他锁：
  +  Amazon Kinesis 数据流 
  +  Amazon Managed Streaming for Apache Kafka 主题 
  +  支持的外部流，例如 Confluent Cloud Kafka 主题 

  有关更多信息，请参阅 [流式摄取到实体化视图](materialized-view-streaming-ingestion.md)。

## 示例
<a name="r_DELETE-examples"></a>

从 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;
```