ALTER TABLE
描述
修改现有表,包括:
- 修改表名、分区名、索引名、列名
- 修改表注释
- 修改分区(增删分区和修改分区属性)
- 修改分桶方式和分桶数量
- 修改列(增删列和修改列顺序)
- 创建或删除 rollup index
- 修改 bitmap index
- 修改表的属性
- 对表进行原子替换
- 手动执行 compaction 合并表数据
- 删除主键索引)
提示
此操作需要对目标表具有ALTER权限。
语法
ALTER TABLE [<db_name>.]<tbl_name>
alter_clause1[, alter_clause2, ...]
alter_clause
可以包含以下操作:重命名、注释、分区、分桶、列、汇总索引、Bitmap索引、表属性、交换和合并。
- rename: 修改表名、rollup index 名、partition 名或列名(从 3.3.2 版本开始支持)。
- comment: 修改表的注释。从 3.1 版本开始支持。
- partition: 修改分区属性,删除分区,增加分区。
- bucket:修改分桶方式和分桶数量。
- column: 增加列,删除列,调整列顺序,修改列类型。*
- rollup index: 创建或删除 rollup index。
- bitmap index: 修改 bitmap index。
- swap: 原子替换两张表。
- compaction: 对指定表或分区手动执行 Compaction(数据版本合并)。从 3.1 版本开始支持。
- drop persistent index: 存算分离下删除主键索引。从 3.3.9 版本开始支持。
限制和使用注意事项
- 在一个ALTER TABLE语句中不能同时对分区、列和汇总索引进行操作。
- 列注释不能被修改。
- 一个表一次只能有一个正在进行的schema change操作。不能同时在一个表上运行两个schema change命令。
- 对分桶、列和汇总索引的操作是异步操作。任务提交后会立即返回成功消息。可以运行SHOW ALTER TABLE命令检查进度,并运行CANCEL ALTER TABLE命令取消操作。
- 对重命名、注释、分区、Bitmap索引和交换的操作是同步操作,命令返回表示执行已完成。
重命名
重命名支持修改表名、汇总索引和分区名。
重命名表
ALTER TABLE <tbl_name> RENAME <new_tbl_name>
重命名汇总索引
ALTER TABLE [<db_name>.]<tbl_name>
RENAME ROLLUP <old_rollup_name> <new_rollup_name>
重命名分区
ALTER TABLE [<db_name>.]<tbl_name>
RENAME PARTITION <old_partition_name> <new_partition_name>
重命名列
从v3.3.2起,StarRocks支持重命名列。
ALTER TABLE [<db_name>.]<tbl_name>
RENAME COLUMN <old_col_name> [ TO ] <new_col_name>
备注
- 将列从A重命名为B后,不支持添加名为A的新列。
- 基于重命名列构建的物化视图将失效。必须在具有新名称的列上重建它们。
修改表注释(从v3.1起)
语法:
ALTER TABLE [<db_name>.]<tbl_name> COMMENT = "<new table comment>";
提示
目前,列注释不能被修改。
修改分区
添加分区
可以选择添加Range分区或List分区。不支持添加表达式分区。
语法:
-
Range分区
ALTER TABLE
ADD { single_range_partition | multi_range_partitions } [distribution_desc] ["key"="value"];
single_range_partition ::=
PARTITION [IF NOT EXISTS] <partition_name> VALUES partition_key_desc
partition_key_desc ::=
{ LESS THAN { MAXVALUE | value_list }
| [ value_list , value_list ) } -- 注意,[ 表示左闭区间。
value_list ::=
( <value> [, ...] )
multi_range_partitions ::=
{ PARTITIONS START ("<start_date_value>") END ("<end_date_value>") EVERY ( INTERVAL <N> <time_unit> )
| PARTITIONS START ("<start_integer_value>") END ("<end_integer_value>") EVERY ( <granularity> ) } -- 即使START和END指定的分区列值是整数,分区列值仍需用双引号括起来。但EVERY子句中的间隔值不需要用双引号括起来。 -
List分区
ALTER TABLE
ADD PARTITION <partition_name> VALUES IN (value_list) [distribution_desc] ["key"="value"];
value_list ::=
value_item [, ...]
value_item ::=
{ <value> | ( <value> [, ...] ) }
参数:
-
分区相关参数:
- 对于Range分区,可以添加单个Range分区(
single_range_partition
)或批量添加多个Range分区(multi_range_partitions
)。 - 对于List分区,只能添加单个List分区。
- 对于Range分区,可以添加单个Range分区(
-
distribution_desc
:可以为新分区单独设置桶的数量,但不能单独设置分桶方 法。
-
"key"="value"
:可以为新分区设置属性。详情请参见CREATE TABLE。
示例:
-
Range分区
-
如果在创建表时指定了分区列为
event_day
,例如PARTITION BY RANGE(event_day)
,并且在创建表后需要添加新分区,可以执行:ALTER TABLE site_access ADD PARTITION p4 VALUES LESS THAN ("2020-04-30");
-
如果在创建表时指定了分区列为
datekey
,例如PARTITION BY RANGE (datekey)
,并且在创建表后需要批量添加多个分区,可以执行:ALTER TABLE site_access
ADD PARTITIONS START ("2021-01-05") END ("2021-01-10") EVERY (INTERVAL 1 DAY);
-
-
List分区
-
如果在创建表时指定了单个分区列,例如
PARTITION BY LIST (city)
,并且在创建表后需要添加新分区,可以执行:ALTER TABLE t_recharge_detail2
ADD PARTITION pCalifornia VALUES IN ("Los Angeles","San Francisco","San Diego"); -
如果在创建表时指定了多个分区列,例如
PARTITION BY LIST (dt,city)
,并且在创建表后需要添加新分区,可以执行:ALTER TABLE t_recharge_detail4
ADD PARTITION p202204_California VALUES IN
(
("2022-04-01", "Los Angeles"),
("2022-04-01", "San Francisco"),
("2022-04-02", "Los Angeles"),
("2022-04-02", "San Francisco")
);
-
删除分区
- 删除单个分区:
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITION [ IF EXISTS ] <partition_name> [ FORCE ]
- 批量删除分区(从v3.4.0起支持):
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITIONS [ IF EXISTS ] { partition_name_list | multi_range_partitions } [ FORCE ]
partition_name_list ::= ( <partition_name> [, ... ] )
multi_range_partitions ::=
{ START ("<start_date_value>") END ("<end_date_value>") EVERY ( INTERVAL <N> <time_unit> )
| START ("<start_integer_value>") END ("<end_integer_value>") EVERY ( <granularity> ) } -- 即使分区列值是整数,分区列值仍需用双引号括起来。但EVERY子句中的间隔值不需要用双引号括起来。
multi_range_partitions
的注意事项:
- 仅适用于Range分区。
- 涉及的参数与添加分区中的参数一致。