该语句用于修改已存在的表的结构,比如:修改表及表属性、新增列、修改列及属性、删除列等。

    格式

    1. ALTER TABLE tblname
    2. alter_specification [, alter_specification]...
    3. alter_specification:
    4. ADD [COLUMN] colname column_definition
    5. | ADD [COLUMN] (colname column_definition,...)
    6. | ADD {INDEX | KEY} [indexname] (index_col_name,...) [index_tpye] [index_options]
    7. | ADD UNIQUE [INDEX | KEY] [indexname] (index_col_name,...) [index_type] [index_options]
    8. | ALTER [COLUMN] colname {SET DEFAULT literal | DROP DEFAULT}
    9. | CHANGE [COLUMN] oldcolname newcolname column_definition
    10. | MODIFY [COLUMN] colname column_definition
    11. | DROP [COLUMN] colname
    12. | DROP {INDEX | KEY} indexname
    13. | RENAME [TO | AS] newtblname
    14. | table_options
    15. | partition_options
    16. | DROP TABLEGROUP
    17. | AUTO_INCREMENT [=] num
    18. column_definition:
    19. data_type [NOT NULL | NULL] [DEFAULT defaultvalue]
    20. [AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]
    21. [COMMENT string’]
    22. table_options:
    23. [SET] table_option [table_option]...
    24. table_option:
    25. COMMENT [=] string
    26. | COMPRESSION [=] {NONE | LZ4_1.0 | ZSTD_1.0 | SNAPPY_1.0 | ZLIB_1.0}
    27. | EXPIRE_INFO [=] expr
    28. | REPLICA_NUM [=] num
    29. | TABLE_ID [=] id
    30. | BLOCK_SIZE [=] size
    31. | USE_BLOOM_FILTER [=] {True| False}
    32. | STEP_MERGE_NUM [=] num
    33. | TABLEGROUP [=] tablegroupname
    34. | PRIMARY_ZONE [=] zonelist
    35. | AUTO_INCREMENT [=] num
    36. | PCTFREE [=] integer
    37. | {READ ONLY | READ WRITE}
    38. | LOCALITY [=] locality
    39. partition_options:
    40. PARTITION BY
    41. HASH(expr)
    42. | KEY(column_list)
    43. [PARTITIONS num]
    44. [partition_definition ...]
    45. partition_definition:
    46. COMMENT [=] commenttext
    • 增加列
    1. ALTER TABLE tblname
    2.     ADD [COLUMN] col_name column_definition;
    • column_definition: 请参见 CREATE TABLE 章节
    • 目前不支持增加主键列

    • 修改列属性

    1. ALTER TABLE tblname
    2.     ALTER [COLUMN] colname
    3. [SET DEFAULT literal| DROP DEFAULT];
    • 修改列类型
    1. ALTER TABLE tblname
    2. MODIFY colname column_definition;
    • 删除列
    1. ALTER TABLE tblname
    2.     DROP [COLUMN] colname;

    不允许删除主键列或者包含索引的列。

    • 表重命名
    1. ALTER TABLE tblname
    2. RENAME [TO] newtblname;
    • 列重命名
    1. ALTER TABLE tblname
    2.     CHANGE [COLUMN] oldcolname newcolname column_definition;

    说明

    说明:OceanBase1.0 只支持varchar数据类型改大,不支持其他数据类型。

    示例:将表 t2 的字段 d 改名为 c,并同时修改字段类型。

    1. ALTER TABLE t2 CHANGE COLUMN d c CHAR(10);
    • 设置 Partition 表 BLOCK 大小
    1. ALTER TABLE tblname
    2.     SET BLOCK_SIZE [=] blocksize;
    • 设置该表的副本数

    这里是指表的副本总数是多少。

    1. ALTER TABLE tblname
    2.     SET REPLICA_NUM [ = ] num;
    • 设置该表的压缩方式
    1. ALTER TABLE tblname
    2.     SET COMPRESSION [=] {NONE | LZ4_1.0 | ZSTD_1.0 | SNAPPY_1.0 | ZLIB_1.0};
    • 设置是否使用BloomFilter
    1. ALTER TABLE tblname
    2.     SET USE_BLOOM_FILTER [=] {True | False};
    • 设置注释信息
    1. ALTER TABLE tblname
    2.     SET COMMENT [=] 'commentstring';
    • 设置渐进合并步数

    此功能是设置渐近合并步数,PROGRESSIVE_MERGE_NUM现在限制是1~64。

    1. ALTER TABLE tblname
    2. SET PROGRESSIVE_MERGE_NUM [=] num;
    • 设置表的ZONE属性
    1. ALTER TABLE tblname
    2. zone_specification...;
    3. zone_specification:
    4. PRIMARY_ZONE [=] zone

    示例

    示例1:

    1. 增加列前,执行以下命令查看表信息。
    1. DESCRIBE test;

    ADD前表信息如下:

    ALTER TABLE - 图1

    1. 执行以下命令增加c3列。
    1. ALTER TABLE test ADD c3 int;
    1. 增加列后,执行以下命令查看表信息
    1. DESCRIBE test;

    ADD后的表信息如下:

    ALTER TABLE - 图2

    1. 执行以下命令删除c3列。
    1. ALTER TABLE test DROP c3;
    1. 删除列后,执行以下命令查看表信息。
    1. DESCRIBE test;

    DROP后表信息如下:

    ALTER TABLE - 图3

    示例2:

    1. ALTER TABLE test SET REPLICA_NUM=2, ADD COLUMN c5 INT;

    报错

    • 语法错误时报 ERROR 1064 (42000): Youhave an error in your SQL syntax;
    • 表不存在,报 ERROR 1146 (42S02): Table'XXX' doesn't exist
    • 在已有数据表中增加新主键列,报 ERROR 1503(HY000): A PRIMARY KEY must include all columns in the table
    1. mysql> select * from employees;
    2. +-----+--------+--------+------------+------------+----------+----------+
    3. | id | frame | lname | hired | separated | job_code | store_id |
    4. +-----+--------+--------+------------+------------+----------+----------+
    5. | 4 | 4 | 4 | 2000-04-04 | 2044-04-04 | 1 | 4 |
    6. | 5 | 5 | 5 | 2000-05-05 | 2022-05-05 | 123 | 5 |
    7. | 8 | 8 | 8 | 2000-05-05 | 2001-08-08 | 123 | 9 |
    8. | 2 | test | 2 | 2000-02-02 | 2024-02-02 | 2 | 2 |
    9. | 7 | 7 | 7 | 1999-02-02 | 2007-07-07 | 7 | 10 |
    10. | 3 | 3 | 3 | 2000-03-03 | 2034-03-03 | 3 | 3 |
    11. | 11 | test | test | 2003-03-03 | 2003-05-05 | 11 | 11 |
    12. +-----+--------+--------+------------+------------+----------+----------+
    13. 7 rows in set (0.01 sec)
    14. mysql> alter table employees add id2 int primary key;
    15. ERROR 1068 (42000): Multiple primary key defined
    • 删除不存在列,报 ERROR 1091 (42000): Can't DROP 'XXX'; check that column/key exists
    1. mysql> alter table employees drop id3;
    2. ERROR 1091 (42000): Can't DROP 'id3'; check that column/key exists
    • 数据定义类型和default数据长度不符,报 ERROR 1067 (42000): Invalid default value for 'XXX'
    1. mysql> alter table test1 add colum1 VARCHAR(10) default 'ttttttttttttttttttttttt';
    2. ERROR 1067 (42000): Invalid default value for 'colum1'