ALTER TABLE
功能
该语句用于修改已有表,包括:
- 修改表名、分区名、索引名
- 对表进行原子替换
- 修改表注释
- 增加或删除分区,修改分区属性
- 执行 schema change 增加或删除列,修改列顺序和表属性
- 创建或删除 rollup index
- 修改 Bitmap 索引
- 手动执行 compaction 合并表数据
提示
该操作需要有对应表的 ALTER 权限。
语法
ALTER TABLE 语法格式如下:
ALTER TABLE [<db_name>.]<tbl_name>
alter_clause1[, alter_clause2, ...]
其中 alter_clause 分为 partition、rollup、schema change、rename、index、swap、comment、compact 操作,不同操作的应用场景为:
- rename: 修改表名,rollup index 名称,修改 partition 名称。
- comment: 修改表的注释。从 3.1 版本开始支持。
- partition: 修改分区属性,删除分区,增加分区。
- bucket:修改分桶方式和分桶数量。
- column: 增加列,删除列,调整列顺序,修改列类型 。*
- rollup index: 创建或删除 rollup index。
- bitmap index: 修改 bitmap index。
- swap: 原子替换两张表。
- compaction: 对指定表或分区手动执行 Compaction(数据版本合并)。从 3.1 版本开始支持。
使用限制和注意事项
- partition、column 和 rollup index 这些操作不能同时出现在一条
ALTER TABLE
语句中。 - 当前还不支持修改列名。
- 当前还不支持修改列注释。
- 每张表仅支持一个进行中的 Schema Change 操作。不能对同一张表同时执行两条 Schema Change 命令。
- bucket、column、rollup index 是异步操作,命令提交成功后会立即返回一个成功消息,您可以使用 SHOW ALTER TABLE 语句查看操作的进度。如果需要取消正在进行的操作,则您可以使用 CANCEL ALTER TABLE。
- rename、comment、partition、bitmap index 和 swap 是同步操作,命令返回表示执行完毕。
Rename 对名称进行修改
修改表名
语法:
ALTER TABLE <tbl_name> RENAME <new_tbl_name>;
修改 rollup index 名称 (RENAME ROLLUP)
语法:
ALTER TABLE [<db_name>.]<tbl_name>
RENAME ROLLUP old_rollup_name new_rollup_name;
修改 partition 名称 (RENAME PARTITION)
语法:
ALTER TABLE [<db_name>.]<tbl_name>
RENAME PARTITION <old_partition_name> <new_partition_name>;
修改表的注释(3.1 版本起)
语法:
ALTER TABLE [<db_name>.]<tbl_name> COMMENT = "<new table comment>";
提示
当前还不支持修改列注释。
操作 partition 相关语法
增加分区 (ADD PARTITION)
语法:
ALTER TABLE [<db_name>.]<tbl_name>
ADD PARTITION [IF NOT EXISTS] <partition_name>
partition_desc ["key"="value"]
[DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]];
注意:
-
partition_desc 支持以下两种写法:
VALUES LESS THAN [MAXVALUE|("value1", ...)]
VALUES [("value1", ...), ("value1", ...)]
-
分区为左闭右开区间,如果用户仅指定右边界,系统会自动确定左边界。
-
如果没有指定分桶方式,则自动使用建表使用的分桶方式。
-
如指定分桶方式,只能修改分桶数,不可修改分桶方式或分桶列。
-
["key" = "value"]
部分可以设置分区的一些属性,具体说明见 CREATE TABLE。
删除分区 (DROP PARTITION)
语法:
-- 2.0之前版本
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITION [IF EXISTS | FORCE] <partition_name>;
-- 2.0及之后版本
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITION [IF EXISTS] <partition_name> [FORCE];
注意:
- 使用分区方式的表至少要保留一个分区。
- 执行 DROP PARTITION 一段时间内(默认 1 天),可以通过 RECOVER 语句恢复被删除的分区。详见 RECOVER 语句。
- 如果执行 DROP PARTITION FORCE,则系统不会检查该分区是否存在未完成的事务,分区将直接被删除并且不能被恢复,一般不建议执行此操作。
增加临时分区 (ADD TEMPORARY PARTITION)
详细使用信息,请查阅临时分区。
语法:
ALTER TABLE [<db_name>.]<tbl_name>
ADD TEMPORARY PARTITION [IF NOT EXISTS] <partition_name>
partition_desc ["key"="value"]
[DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]];
使用临时分区替换原分区
语法:
ALTER TABLE [<db_name>.]<tbl_name>
REPLACE PARTITION <partition_name>
partition_desc ["key"="value"]
WITH TEMPORARY PARTITION
partition_desc ["key"="value"]
[PROPERTIES ("key"="value", ...)]
删除临时分区 (DROP TEMPORARY PARTITION)
语法:
ALTER TABLE [<db_name>.]<tbl_name>
DROP TEMPORARY PARTITION <partition_name>;
修改分区属性 (MODIFY PARTITION)
语法:
ALTER TABLE [<db_name>.]<tbl_name>
MODIFY PARTITION { <partition_name> | partition_name_list | (*) }
SET ("key" = "value", ...);
使用说明:
-
当前支持修改分区的下列属性:
- storage_medium
- storage_cooldown_ttl 或 storage_cooldown_time
- replication_num
-
对于单分区表,分区名同表名。对于多分区表,如果需要修改所有分区的属性,则使用
(*)
更加方便。 -
执行
SHOW PARTITIONS FROM <tbl_name>
查看修改后分区属性。
Schema change
下文中的 index 为物化索引。建表成功后表为 base 表 (base index),基于 base 表可 创建 rollup index。
base index 和 rollup index 都是物化索引。下方语句在编写时如果没有指定 rollup_index_name
,默认操作基表。
向指定 index 的指定位置添加一列 (ADD COLUMN)
语法:
ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
注意:
1. 聚合模型如果增加 value 列,需要指定 agg_type。
2. 非聚合模型(如 DUPLICATE KEY)如果增加 key 列,需要指定 KEY 关键字。
3. 不能在 rollup index 中 增加 base index 中已经存在的列,如有需要,可以重新创建一个 rollup index。
向指定 index 添加多列
语法:
-
添加多列:
ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN (column_name1 column_type [KEY | agg_type] DEFAULT "default_value", ...)
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)] -
添加多列的同时通过
AFTER
指定列的添加位置:ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN column_name1 column_type [KEY | agg_type] DEFAULT "default_value" AFTER column_name,
ADD COLUMN column_name2 column_type [KEY | agg_type] DEFAULT "default_value" AFTER column_name
[, ...]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
注意:
- 聚合模型如果增加 value 列,需要指定 agg_type。
- 非聚合模型如果增加 key 列,需要指定 KEY 关键字。
- 不能在 rollup index 中增加 base index 中已经存在的列,如有需要,可以重新创建一个 rollup index。
从指定 index 中删除一列 (DROP COLUMN)
语法:
ALTER TABLE [<db_name>.]<tbl_name>
DROP COLUMN column_name
[FROM rollup_index_name];
注意:
- 不能删除分区列。
- 如果是从 base index 中删除列,则如果 rollup index 中包含该列,也会被删除。