alter
ALTER
ALTER
仅支持 *MergeTree
,Merge
以及Distributed
等引擎表。
该操作有多种形式。
列操作
改变表结构:
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 [IF NOT EXISTS] name [type] [default_expr] [codec] [AFTER name_after]
使用指定的name
, type
, codec
以及 default_expr
(请参见 Default expressions),往表中增加新的列。
如果sql中包含 IF NOT EXISTS
,执行语句时如果列已经存在,CH不会报错。如果指定AFTER name_after
(表中另一个列的名称),则新的列会加在指定列的后面。否则,新的列将被添加到表的末尾。注意,不能将新的列添加到表的开始位置, name_after
可以是执行该动作时已经在表中存在的任意列。
添加列仅仅是改变原有表的结构不会对已有数据产生影响。执行完 ALTER
后磁盘中也不会出现新的数据。如果查询表时列的数据为空,那么CH会使用列的默认值来进行填充(如果有默认表达式,则使用这个;或者用0或空字符串)。当数据块完成合并(参见MergeTree)后,磁盘中会出现该列的数据。
这种方式允许 ALTER
语句能马上执行。不需要增加原有数据的大小。
示例:
ALTER TABLE visits ADD COLUMN browser String AFTER user_id
删除列
DROP COLUMN [IF EXISTS] name
通过指定 name
删除列。如果语句包含 IF EXISTS
,执行时遇到不存在的列也不会报错。
从文件系统中删除数据。由于是删除列的整个文件,该语句几乎是立即执行完成的。
示例:
ALTER TABLE visits DROP COLUMN browser