ALTER TABLE 前缀使这种语法有别于大多数其他支持 SQL 的系统。这样设计是为了表明,与 OLTP 数据库中的类似查询不同,这是一项开销较大的操作,并非为频繁使用而设计。filter_expr 必须为 UInt8 类型。对于 filter_expr 取非零值的行,此查询会将指定列的值更新为相应表达式的值。这些值会使用 CAST 运算符转换为列类型。不支持更新用于计算主键或分区键的列。
一条查询可以包含多个以逗号分隔的命令。
IN PARTITION 子句将变更限定在所列出的分区上。若不使用该子句,在 ReplicatedMergeTree 家族的表上,当启用 optimize_mutations_with_partition_pruning 设置时 (默认启用) ,ClickHouse 会自动检测 filter_expr 中的分区键条件,并仅对受影响的分区执行变更。在非复制表的 MergeTree 表上,请使用显式的 IN PARTITION 子句将变更限定到特定分区。
查询处理的同步方式由 mutations_sync 设置决定。默认情况下,它是异步的。
另请参阅
- Mutations
- ALTER 查询的同步性
- mutations_sync 设置
- 轻量级
UPDATE- 使用补丁分区片段的轻量级更新替代方案 APPLY PATCHES- 手动应用轻量级更新中的补丁
materialized 列
表达式引用已更新列的MATERIALIZED 列会在变更期间重新计算,因此其存储值将与新数据保持一致。
基于 EPHEMERAL 列计算的列
EPHEMERAL 列仅在执行 INSERT 期间存在,且不会被存储。因此,基于该列计算的 MATERIALIZED 列无法通过变更重新计算。这类列会保留 INSERT 时计算出的值,之后该值将不再与其表达式匹配:
m 为 8,即在 INSERT 时计算得出的值,而非 2 + 7:e 的值在提供该值的
INSERT 之外不可用。因此,变更跳过某列时会在服务器日志中写入一条警告。要更新此类列,请重新 INSERT 受影响的行。