ALTER TABLE COLUMN
描述
该语句用于对已有 table 进行 Schema change 操作。schema change 是异步的,任务提交成功则返回,之后可使用 SHOW ALTER TABLE COLUMN 命令查看进度。
:::tip PALO 在建表之后有物化索引的概念,在建表成功后为 base 表,物化索引为 base index,基于 base 表可以创建 rollup index。其中 base index 和 rollup index 都是物化索引,在进行 schema change 操作时如果不指定 rollup_index_name 默认基于 base 表进行操作。 PALO 在 1.2.0 支持了 light schema change 轻量表结构变更,对于值列的加减操作,可以更快地,同步地完成。可以在建表时手动指定 "light_schema_change" = 'true',2.0.0 及之后版本该参数默认开启。 :::
语法:
1ALTER TABLE [database.]table alter_clause;
schema change 的 alter_clause 支持如下几种修改方式:
1. 添加列,向指定的 index 位置进行列添加
语法
1ALTER TABLE [database.]table table_name ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"]
2[AFTER column_name|FIRST]
3[TO rollup_index_name]
4[PROPERTIES ("key"="value", ...)]
Example
- 向 example_db.my_table 的 key_1 后添加一个 key 列 new_col (非聚合模型)
1ALTER TABLE example_db.my_table
2ADD COLUMN new_col INT KEY DEFAULT "0" AFTER key_1;
- 向 example_db.my_table 的 value_1 后添加一个 value 列 new_col (非聚合模型)
1ALTER TABLE example_db.my_table
2ADD COLUMN new_col INT DEFAULT "0" AFTER value_1;
- 向 example_db.my_table 的 key_1 后添加一个 key 列 new_col (聚合模型)
1ALTER TABLE example_db.my_table
2ADD COLUMN new_col INT KEY DEFAULT "0" AFTER key_1;
- 向 example_db.my_table 的 value_1 后添加一个 value 列 new_col SUM 聚合类型 (聚合模型)
1ALTER TABLE example_db.my_table
2ADD COLUMN new_col INT SUM DEFAULT "0" AFTER value_1;
- 将 new_col 添加到 example_db.my_table 表的首列位置 (非聚合模型)
1ALTER TABLE example_db.my_table
2ADD COLUMN new_col INT KEY DEFAULT "0" FIRST;
:::tip
- 聚合模型如果增加 value 列,需要指定 agg_type
- 非聚合模型(如 DUPLICATE KEY)如果增加 key 列,需要指定 KEY 关键字 :::
2. 添加多列,向指定的 index 位置进行多列添加
语法
1ALTER TABLE [database.]table table_name ADD COLUMN (column_name1 column_type [KEY | agg_type] DEFAULT "default_value", ...)
2[TO rollup_index_name]
3[PROPERTIES ("key"="value", ...)]
Example
- 向 example_db.my_table 中添加多列,new_col 和 new_col2 都是 SUM 聚合类型 (聚合模型)
1ALTER TABLE example_db.my_table
2ADD COLUMN (new_col1 INT SUM DEFAULT "0" ,new_col2 INT SUM DEFAULT "0");
- 向 example_db.my_table 中添加多列 (非聚合模型),其中 new_col1 为 KEY 列,new_col2 为 value 列
1ALTER TABLE example_db.my_table
2ADD COLUMN (new_col1 INT key DEFAULT "0" , new_col2 INT DEFAULT "0");
:::tip
- 聚合模型如果增加 value 列,需要指定 agg_type
- 聚合模型如果增加 key 列,需要指定 KEY 关键字
- 不能在 rollup index 中增加 base index 中已经存在的列(如有需要,可以重新创建一个 rollup index) :::
3. 删除列,从指定 index 中删除一列
语法
1ALTER TABLE [database.]table table_name DROP COLUMN column_name
2[FROM rollup_index_name]
Example
-
从 example_db.my_table 中删除 col1 列
SQL1ALTER TABLE example_db.my_table DROP COLUMN col1;
:::tip
- 不能删除分区列
- 聚合模型不能删除 KEY 列
- 聚合模型不能删除 KEY 列
- 如果是从 base index 中删除列,则如果 rollup index 中包含该列,也会被删除 :::
4. 修改指定列类型以及列位置
语法
1ALTER TABLE [database.]table table_name MODIFY COLUMN column_name column_type [KEY | agg_type] [NULL | NOT NULL] [DEFAULT "default_value"]
2[AFTER column_name|FIRST]
3[FROM rollup_index_name]
4[PROPERTIES ("key"="value", ...)]
Example
- 修改 example_db.my_table 的 key 列 col1 的类型为 BIGINT,并移动到 col2 列后面。
1ALTER TABLE example_db.my_table
2MODIFY COLUMN col1 BIGINT KEY DEFAULT "1" AFTER col2;
:::tip 无论是修改 key 列还是 value 列都需要声明完整的 column 信息 :::
- 修改 example_db.my_table 的 val1 列最大长度。原 val1 为 (val1 VARCHAR(32) REPLACE DEFAULT "abc")
1ALTER TABLE example_db.my_table
2MODIFY COLUMN val1 VARCHAR(64) REPLACE DEFAULT "abc";
:::tip 只能修改列的类型,列的其他属性维持原样 :::
- 修改 Duplicate key 表 Key 列的某个字段的长度
1ALTER TABLE example_db.my_table
2MODIFY COLUMN k3 VARCHAR(50) KEY NULL COMMENT 'to 50';
:::tip
- 聚合模型如果修改 value 列,需要指定 agg_type
- 非聚合类型如果修改 key 列,需要指定 KEY 关键字
- 只能修改列的类型,列的其他属性维持原样(即其他属性需在语句中按照原属性显式的写出,参见 example 8)
- 分区列和分桶列不能做任何修改
-
目前支持以下类型的转换(精度损失由用户保证)
- TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE 类型向范围更大的数字类型转换
- TINTINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE/DECIMAL 转换成 VARCHAR
- VARCHAR 支持修改最大长度
- VARCHAR/CHAR 转换成 TINTINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE
- VARCHAR/CHAR 转换成 DATE (目前支持"%Y-%m-%d", "%y-%m-%d", "%Y%m%d", "%y%m%d", "%Y/%m/%d, "%y/%m/%d"六种格式化格式)
- DATETIME 转换成 DATE(仅保留年 - 月 - 日信息,例如:
2019-12-09 21:47:05<-->2019-12-09) - DATE 转换成 DATETIME(时分秒自动补零,例如:
2019-12-09<-->2019-12-09 00:00:00) - FLOAT 转换成 DOUBLE
- INT 转换成 DATE (如果 INT 类型数据不合法则转换失败,原始数据不变)
- 除 DATE 与 DATETIME 以外都可以转换成 STRING,但是 STRING 不能转换任何其他类型
:::
5. 对指定表的列进行重新排序
语法
1ALTER TABLE [database.]table table_name ORDER BY (column_name1, column_name2, ...)
2[FROM rollup_index_name]
3[PROPERTIES ("key"="value", ...)]
Example
- 调整 example_db.my_table 的 key 列 和 value 列的顺序(非聚合模型)
1CREATE TABLE `my_table`(
2`k_1` INT NULL,
3`k_2` INT NULL,
4`v_1` INT NULL,
5`v_2` varchar NULL,
6`v_3` varchar NULL
7) ENGINE=OLAP
8DUPLICATE KEY(`k_1`, `k_2`)
9COMMENT 'OLAP'
10DISTRIBUTED BY HASH(`k_1`) BUCKETS 5
11PROPERTIES (
12"replication_allocation" = "tag.location.default: 1"
13);
14
15ALTER TABLE example_db.my_table ORDER BY (k_2,k_1,v_3,v_2,v_1);
16
17mysql> desc my_table;
18+-------+------------+------+-------+---------+-------+
19| Field | Type | Null | Key | Default | Extra |
20+-------+------------+------+-------+---------+-------+
21| k_2 | INT | Yes | true | NULL | |
22| k_1 | INT | Yes | true | NULL | |
23| v_3 | VARCHAR(*) | Yes | false | NULL | NONE |
24| v_2 | VARCHAR(*) | Yes | false | NULL | NONE |
25| v_1 | INT | Yes | false | NULL | NONE |
26+-------+------------+------+-------+---------+-------+
- 同时执行添加列和列排序操作
1CREATE TABLE `my_table` (
2`k_1` INT NULL,
3`k_2` INT NULL,
4`v_1` INT NULL,
5`v_2` varchar NULL,
6`v_3` varchar NULL
7) ENGINE=OLAP
8DUPLICATE KEY(`k_1`, `k_2`)
9COMMENT 'OLAP'
10DISTRIBUTED BY HASH(`k_1`) BUCKETS 5
11PROPERTIES (
12"replication_allocation" = "tag.location.default: 1"
13);
14
15ALTER TABLE example_db.my_table
16ADD COLUMN col INT DEFAULT "0" AFTER v_1,
17ORDER BY (k_2,k_1,v_3,v_2,v_1,col);
18
19mysql> desc my_table;
20+-------+------------+------+-------+---------+-------+
21| Field | Type | Null | Key | Default | Extra |
22+-------+------------+------+-------+---------+-------+
23| k_2 | INT | Yes | true | NULL | |
24| k_1 | INT | Yes | true | NULL | |
25| v_3 | VARCHAR(*) | Yes | false | NULL | NONE |
26| v_2 | VARCHAR(*) | Yes | false | NULL | NONE |
27| v_1 | INT | Yes | false | NULL | NONE |
28| col | INT | Yes | false | 0 | NONE |
29+-------+------------+------+-------+---------+-------+
:::tip
- index 中的所有列都要写出来
- value 列在 key 列之后
- key 列只能调整 key 列的范围内进行调整,value 列同理 :::
关键词
1ALTER, TABLE, COLUMN, ALTER TABLE
