参考资料
https://clickhouse.tech/docs/en/sql-reference/statements/alter/
版本:v20.11
目录
操作分区(Manipulating Partitions and Parts)
ORDER BY表达式(Manipulating Key Expressions)
SAMPLE BY表达式(Manipulating Sampling-Key Expressions)
INDEX(Manipulating Data Skipping Indices)
CONSTRAINT(Manipulating Constraints)
TTL(Manipulations with Table TTL)
总览
大多数ALTER查询都会修改表设置或数据:
大多数* ALTER查询仅支持* MergeTree表以及Merge和Distributed。
ALTER设置会修改基于角色的访问控制有关的实体:
突变(Mutations)
更改表数据的ALTER是通过一种称为“突变”的机制实现的。最值得注意的是 ALTER TABLE … DELETE 和 ALTER TABLE … UPDATE.。它们是异步后台进程,类似于MergeTree表中的合并,生成一种新的“突变”版本。
对于* MergeTree表,通过重写整个数据部分来执行变异。没有原子性,一部分数据准备好后,它们就会立即替换为突变的部分。在突变期间执行SELECT语句将会看到突变部分和未突变部分的数据。
突变完全按照创建顺序应用到各个数据部分,突变还通过INSERT INTO查询进行了部分排序:突变前插入表中的数据将发生突变,之后插入的数据将不会发生突变。请注意,突变不会以任何方式阻止插入。
在突变查询被提交后将立即开始突变(对于ZooKeeper是复制表,对于文件系统是非复制表)。
突变本身使用系统配置文件设置异步执行。要跟踪突变的进度,可以使用system.mutations表。
即使ClickHouse服务器重新启动,成功提交的突变如果没有执行完也会继续执行。
突变一旦提交就没有办法回滚。如果出现突变过程中卡住的情况, 可以使用KILL MUTATION来将其取消。
完成变异的条目不会立即删除(保留条目的数量由finish_mutations_to_keep存储引擎参数确定)。 较旧的突变条目将被删除。
ALTER同步性
对于非复制表,所有ALTER查询都是同步执行的。 对于复制的表,查询仅向ZooKeeper添加适当操作的指令,并且这些操作本身将尽快执行。 查询可以等待所有副本上完成这些操作。
对于ALTER ... ATTACH|DETACH|DROP 查询,可以使用replication_alter_partitions_sync来设置等待。 可能的值:0 –不等待; 1 –仅等待自己执行(默认); 2 –等待所有。
对于ALTER TABLE ... UPDATE | DELETE查询,其同步性是由mutations_sync设置定义的。
列操作(Column Manipulations)
允许更改表结构的查询。
ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|CLEAR|COMMENT|MODIFY COLUMN ...
在查询中,指定一个或多个逗号分隔操作的列表。
每个动作都是对列的操作。
支持以下操作:
- ADD COLUMN — 在表中添加一个新列。
- DROP COLUMN — 删除列
- CLEAR COLUMN — 清空列
- COMMENT COLUMN — 向该列添加文本注释。
- MODIFY COLUMN — 更改列类型,默认值和TTL
ADD COLUMN
ADD COLUMN [IF NOT EXISTS] name [type] [default_expr] [codec] [AFTER name_after]
给表添加一个新列,指定名称,类型,压缩类型codec,默认表达式。
如果包含IF NOT EXISTS子句,那么创建时遇到相同名称的列不会报错。如果指定AFTER name_after(另一列的名称),则该列将添加到列表中指定的列之后。否则,该列将添加到表的末尾。 请注意,无法将列添加到表的开头。对一系列的操作,name_after可以是之前的操作插入的列名。
添加列只会对表结构进行操作,不会对数据做操作。如果给列制定了默认表达式,ALTER后,数据也不会立刻出现落在磁盘上,合并数据后才会出现。
这种方法使我们能够立即完成ALTER查询,而无需增加旧数据量。
ALTER TABLE visits ADD COLUMN browser String AFTER user_id
DROP COLUMN
DROP COLUMN [IF EXISTS] name
--举例
ALTER TABLE visits DROP COLUMN browser
删除名称为name的列。 如果指定了IF EXISTS子句,则该列不存在时查询将不会返回错误。
从文件系统中删除数据。 由于此操作会删除整个文件,因此查询几乎立即完成。
CLEAR COLUMN
CLEAR COLUMN [IF EXISTS] name IN PARTITION partition_name
--举例
ALTER TABLE visits CLEAR COLUMN browser IN PARTITION tuple()
重置指定分区的列中的所有数据。 在如何指定分区表达式部分中阅读有关设置分区名称的更多信息。How to specify the partition expression.
如果指定了IF EXISTS子句,则该列不存在时查询将不会返回错误。
COMMENT COLUMN
COMMENT COLUMN [IF EXISTS] name 'comment'
--举例
ALTER TABLE visits COMMENT COLUMN browser 'The table shows the browser used for accessing the site.'