ALTER-TABLE-COLUMN

Name

ALTER TABLE COLUMN

Description

该语句用于对已有 table 进行 Schema change 操作。schema change 是异步的,任务提交成功则返回,之后可使用SHOW ALTER 命令查看进度。

语法:

  1. ALTER TABLE [database.]table alter_clause;

schema change 的 alter_clause 支持如下几种修改方式:

  1. 向指定 index 的指定位置添加一列

语法:

  1. 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", ...)]

注意:

  • 聚合模型如果增加 value 列,需要指定 agg_type
  • 非聚合模型(如 DUPLICATE KEY)如果增加key列,需要指定KEY关键字
  • 不能在 rollup index 中增加 base index 中已经存在的列(如有需要,可以重新创建一个 rollup index)
  1. 向指定 index 添加多列

语法:

  1. ADD COLUMN (column_name1 column_type [KEY | agg_type] DEFAULT "default_value", ...)
  2. [TO rollup_index_name]
  3. [PROPERTIES ("key"="value", ...)]

注意:

  • 聚合模型如果增加 value 列,需要指定agg_type
  • 聚合模型如果增加key列,需要指定KEY关键字
  • 不能在 rollup index 中增加 base index 中已经存在的列(如有需要,可以重新创建一个 rollup index)
  1. 从指定 index 中删除一列

语法:

  1. DROP COLUMN column_name
  2. [FROM rollup_index_name]

注意:

  • 不能删除分区列
  • 如果是从 base index 中删除列,则如果 rollup index 中包含该列,也会被删除
  1. 修改指定 index 的列类型以及列位置

    语法:

  1. 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", ...)]

注意:

  • 聚合模型如果修改 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不能转换任何其他类型
  1. 对指定 index 的列进行重新排序

语法:

  1. ORDER BY (column_name1, column_name2, ...)
  2. [FROM rollup_index_name]
  3. [PROPERTIES ("key"="value", ...)]

注意:

  • index 中的所有列都要写出来
  • value 列在 key 列之后

Example

  1. 向 example_rollup_index 的 col1 后添加一个key列 new_col(非聚合模型)
  1. ALTER TABLE example_db.my_table
  2. ADD COLUMN new_col INT KEY DEFAULT "0" AFTER col1
  3. TO example_rollup_index;
  1. 向example_rollup_index的col1后添加一个value列new_col(非聚合模型)
  1. ALTER TABLE example_db.my_table
  2. ADD COLUMN new_col INT DEFAULT "0" AFTER col1
  3. TO example_rollup_index;
  1. 向example_rollup_index的col1后添加一个key列new_col(聚合模型)
  1. ALTER TABLE example_db.my_table
  2. ADD COLUMN new_col INT DEFAULT "0" AFTER col1
  3. TO example_rollup_index;
  1. 向example_rollup_index的col1后添加一个value列new_col SUM聚合类型(聚合模型)
  1. ALTER TABLE example_db.my_table
  2. ADD COLUMN new_col INT SUM DEFAULT "0" AFTER col1
  3. TO example_rollup_index;
  1. 向 example_rollup_index 添加多列(聚合模型)
  1. ALTER TABLE example_db.my_table
  2. ADD COLUMN (col1 INT DEFAULT "1", col2 FLOAT SUM DEFAULT "2.3")
  3. TO example_rollup_index;
  1. 从 example_rollup_index 删除一列
  1. ALTER TABLE example_db.my_table
  2. DROP COLUMN col2
  3. FROM example_rollup_index;
  1. 修改 base index 的 key 列 col1 的类型为 BIGINT,并移动到 col2 列后面。
  1. ALTER TABLE example_db.my_table
  2. MODIFY COLUMN col1 BIGINT KEY DEFAULT "1" AFTER col2;

注意:无论是修改 key 列还是 value 列都需要声明完整的 column 信息

  1. 修改 base index 的 val1 列最大长度。原 val1 为 (val1 VARCHAR(32) REPLACE DEFAULT “abc”)
  1. ALTER TABLE example_db.my_table
  2. MODIFY COLUMN val1 VARCHAR(64) REPLACE DEFAULT "abc";
  1. 重新排序 example_rollup_index 中的列(设原列顺序为:k1,k2,k3,v1,v2)
  1. ALTER TABLE example_db.my_table
  2. ORDER BY (k3,k1,k2,v2,v1)
  3. FROM example_rollup_index;
  1. 同时执行两种操作
  1. ALTER TABLE example_db.my_table
  2. ADD COLUMN v2 INT MAX DEFAULT "0" AFTER k2 TO example_rollup_index,
  3. ORDER BY (k3,k1,k2,v2,v1) FROM example_rollup_index;
  1. 修改Duplicate key 表 Key 列的某个字段的长度
  1. alter table example_tbl modify column k3 varchar(50) key null comment 'to 50'

Keywords

  1. ALTER, TABLE, COLUMN, ALTER TABLE

Best Practice