> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-trino-dialect.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> ALTER TABLE ... UPDATE 语句文档

# ALTER TABLE ... UPDATE 语句

```sql theme={null}
ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_id] WHERE filter_expr
```

对与指定过滤表达式匹配的数据进行操作。其作为一种[变更](/zh/reference/statements/alter/index#mutations)实现。

<Note>
  `ALTER TABLE` 前缀使这种语法有别于大多数其他支持 SQL 的系统。这样设计是为了表明，与 OLTP 数据库中的类似查询不同，这是一项开销较大的操作，并非为频繁使用而设计。
</Note>

`filter_expr` 必须为 `UInt8` 类型。对于 `filter_expr` 取非零值的行，此查询会将指定列的值更新为相应表达式的值。这些值会使用 `CAST` 运算符转换为列类型。不支持更新用于计算主键或分区键的列。

一条查询可以包含多个以逗号分隔的命令。

查询处理的同步方式由 [mutations\_sync](/zh/reference/settings/session-settings/mutations#mutations_sync) 设置决定。默认情况下，它是异步的。

**另请参阅**

* [Mutations](/zh/reference/statements/alter/index#mutations)
* [ALTER 查询的同步性](/zh/reference/statements/alter/index#synchronicity-of-alter-queries)
* [mutations\_sync](/zh/reference/settings/session-settings/mutations#mutations_sync) 设置
* [轻量级 `UPDATE`](/zh/reference/statements/update) - 使用补丁分区片段的轻量级更新替代方案
* [`APPLY PATCHES`](/zh/reference/statements/alter/apply-patches) - 手动应用轻量级更新中的补丁

<div id="materialized-columns">
  ## materialized 列
</div>

表达式引用已更新列的 [`MATERIALIZED`](/zh/reference/statements/create/table#materialized) 列会在变更期间重新计算，因此其存储值将与新数据保持一致。

<div id="columns-calculated-from-ephemeral-columns">
  ### 基于 EPHEMERAL 列计算的列
</div>

[`EPHEMERAL`](/zh/reference/statements/create/table#ephemeral) 列仅在执行 `INSERT` 期间存在，且不会被存储。因此，基于该列计算的 `MATERIALIZED` 列无法通过变更重新计算。这类列会保留 `INSERT` 时计算出的值，之后该值将不再与其表达式匹配：

```sql theme={null}
CREATE TABLE test
(
    x Int32,
    e Int32 EPHEMERAL 0,
    m Int32 MATERIALIZED x + e
)
ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO test (x, e) VALUES (1, 7);

ALTER TABLE test UPDATE x = 2 WHERE 1;

SELECT x, m FROM test;
```

```text theme={null}
┌─x─┬─m─┐
│ 2 │ 8 │
└───┴───┘
```

`m` 为 `8`，即在 `INSERT` 时计算得出的值，而非 `2 + 7`：`e` 的值在提供该值的
`INSERT` 之外不可用。因此，变更跳过某列时会在服务器日志中写入一条警告。要更新此类列，请重新 `INSERT` 受影响的行。

<div id="related-content">
  ## 相关内容
</div>

* 博客：[在 ClickHouse 中处理更新与删除操作](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse)
