使用变更操作更新和删除 ClickHouse 数据
尽管 ClickHouse 面向的是高吞吐量分析型工作负载,但在某些情况下仍然可以修改或删除已有数据。此类操作称为“变更(mutation)”,并通过 ALTER TABLE 命令执行。
更新数据
使用 ALTER TABLE...UPDATE 命令更新表中的行:
<expression> 是在满足 <filter_expr> 条件时该列的新值。<expression> 必须与该列具有相同的数据类型,或能够通过 CAST 运算符转换为相同的数据类型。<filter_expr> 应当为数据的每一行返回一个 UInt8(0 或非 0)值。多个 UPDATE <column> 语句可以在单个 ALTER TABLE 命令中通过逗号组合执行。
示例:
-
如下所示的 mutation 语句允许通过字典查找将
visitor_ids更新为新值: -
在一个命令中修改多个值,相比多次执行命令可能更加高效:
-
对于分片表,可以使用
ON CLUSTER执行 mutation:
无法更新属于主键或排序键的列。
删除数据
使用 ALTER TABLE 命令删除行:
<filter_expr> 应当为每一行数据返回一个 UInt8 值。
示例
-
删除所有某列的值在给定数组中的记录:
-
这个查询会删除哪些数据?
要删除表中的全部数据,使用 TRUNCATE TABLE [<database].]<table> 命令会更加高效。该命令同样可以配合 ON CLUSTER 一起执行。
请参阅 DELETE 语句 文档页面了解更多详细信息。
轻量级删除
另一种删除行的方式是使用 DELETE FROM 命令,这被称为轻量级删除。被删除的行会立即被标记为已删除,并会在之后的所有查询中自动被过滤掉,因此无需等待数据分片合并,也不需要使用 FINAL 关键字。数据清理会在后台以异步方式进行。
例如,下面的查询会删除 hits 表中所有 Title 列的内容包含文本 hello 的行:
关于轻量级删除的几点说明:
- 此特性仅适用于
MergeTree表引擎家族。 - 轻量级删除默认是同步执行的,会等待所有副本处理完成该删除操作。此行为由
lightweight_deletes_sync设置 控制。