

 从补丁 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/)。

# UPDATE
<a name="r_UPDATE"></a>

**Topics**
+ [语法](#r_UPDATE-synopsis)
+ [参数](#r_UPDATE-parameters)
+ [使用说明](#r_UPDATE_usage_notes)
+ [UPDATE 语句的示例](c_Examples_of_UPDATE_statements.md)

如果满足条件，则更新一个或多个表列中的值。

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

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

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
            UPDATE table_name [ [ AS ] alias ] SET column = { expression | DEFAULT } [,...]

[ FROM fromlist ]
[ WHERE condition ]
```

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

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

 *table\_name*   
一个临时或永久表。只有表所有者或对表具有 UPDATE 权限的用户可以更新行。如果您使用 FROM 子句或从表达式或条件中的表进行选择，则必须对这些表具有 SELECT 权限。您不能在此处为表提供别名；不过可以在 FROM 子句中指定别名。  
Amazon Redshift Spectrum 外部表为只读。您无法对外部表进行 UPDATE。

alias  
目标表的临时备用名称。别名是可选的。AS 关键字始终是可选的。

SET *column* =   
要修改的一个或多个列。未列出的列将保留其当前值。不要将表名包含在目标列的规范中。例如，`UPDATE tab SET tab.col = 1` 是无效的。

 *expression*   
一个定义指定列的新值的表达式。

DEFAULT   
使用 CREATE TABLE 语句中分配给列的默认值更新列。

FROM *tablelist*   
您可以通过引用其他表中的信息来更新表。在 FROM 子句中列出其他表，或者将子查询用作 WHERE 条件的一部分。FROM 子句中列出的表可以具有别名。如果您需要在列表中包含 UPDATE 语句的目标表，请使用别名。

WHERE *condition*   
一个可选子句，用于限制对符合条件的行的更新。当条件返回 `true` 时，将更新指定的 SET 列。条件可以是列上的简单谓词，也可以是基于子查询的结果的条件。  
可以在子查询中命名任何表，包括 UPDATE 的目标表。

## 使用说明
<a name="r_UPDATE_usage_notes"></a>

在更新表中的大量行后：
+ 对表执行 Vacuum 操作，以回收存储空间并对行重新排序。
+ 分析表以更新查询计划程序的统计数据。

UPDATE 语句的 FROM 子句中不支持左、右和完整外部联接；它们将返回以下错误：

```
ERROR: Target table must be part of an equijoin predicate
```

 如果需要指定外部联接，请在 UPDATE 语句的 WHERE 子句中使用子查询。

如果您的 UPDATE 语句需要自联接到目标表，您需要指定联接条件以及限定更新操作的行的 WHERE 子句条件。通常，在将目标表联接到自身或其他表时，最佳实践是使用可明确地将联接条件与限定要更新的行的条件分隔的子查询。

每行具有多个匹配项的 UPDATE 查询会在配置参数 `error_on_nondeterministic_update` 被设置为 *true* 时引发错误。有关更多信息，请参阅 [error\_on\_nondeterministic\_update](r_error_on_nondeterministic_update.md)。

您可以更新 GENERATED BY DEFAULT AS IDENTITY 列。您可以使用您提供的值来更新定义为 GENERATED BY DEFAULT AS IDENTITY 的列。有关更多信息，请参阅 [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause)。