ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_id] WHERE filter_expr对与指定过滤表达式匹配的数据进行操作。其作为一种变更实现。
filter_expr 必须为 UInt8 类型。对于 filter_expr 取非零值的行,此查询会将指定列的值更新为相应表达式的值。这些值会使用 CAST 运算符转换为列类型。不支持更新用于计算主键或分区键的列。
一条查询可以包含多个以逗号分隔的命令。
查询处理的同步方式由 mutations_sync 设置决定。默认情况下,它是异步的。
另请参阅
- Mutations
- ALTER 查询的同步性
- mutations_sync 设置
- 轻量级
UPDATE- 使用补丁分区片段的轻量级更新替代方案 APPLY PATCHES- 手动应用轻量级更新中的补丁
materialized 列
表达式引用已更新列的 MATERIALIZED 列会在变更期间重新计算,因此其存储值将与新数据保持一致。
基于 EPHEMERAL 列计算的列
EPHEMERAL 列仅在执行 INSERT 期间存在,且不会被存储。因此,基于该列计算的 MATERIALIZED 列无法通过变更重新计算。这类列会保留 INSERT 时计算出的值,之后该值将不再与其表达式匹配:
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;┌─x─┬─m─┐
│ 2 │ 8 │
└───┴───┘m 为 8,即在 INSERT 时计算得出的值,而非 2 + 7:e 的值在提供该值的
INSERT 之外不可用。因此,变更跳过某列时会在服务器日志中写入一条警告。要更新此类列,请重新 INSERT 受影响的行。