---
title: "ALTER TABLE - OceanBase 数据库 V4.2.1 | OceanBase 文档中心"
description: ALTER TABLE 描述 该语句用来修改已存在表的结构，例如修改表及表属性、新增列、修改列及属性、删除列等。 权限要求 执行 ALTER TABLE 语句，需要当前用户拥有 ALTER 权限。有关 OceanBase 数据库权限的详细介绍，请参见 MySQL 模式下的权限分类 。 语法 ALTER TABLE t…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.2.1 LTS

# ALTER TABLE

更新时间：2026-08-24 14:12:55

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.1/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/600.sql-statement-of-mysql-mode/1600.alter-table-of-mysql-mode.md)  

## 描述

该语句用来修改已存在表的结构，例如修改表及表属性、新增列、修改列及属性、删除列等。

## 权限要求

执行 `ALTER TABLE` 语句，需要当前用户拥有 `ALTER` 权限。有关 OceanBase 数据库权限的详细介绍，请参见 [MySQL 模式下的权限分类](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220876)。

## 语法

```sql
ALTER TABLE table_name {alter_table_action_list | alter_partition_option};

alter_table_action_list:
    alter_table_action [, alter_table_action ...]

alter_table_action:
    [SET] table_options
    | ADD [COLUMN] column_name column_definition
    | ADD [COLUMN] (column_definition_list)
    | ALTER [COLUMN] column_name {SET DEFAULT const_value
                                 | DROP DEFAULT}
    | DROP [COLUMN] column_name
    | CHANGE [COLUMN] column_name new_column_name column_definition
    | MODIFY [COLUMN] column_name column_definition
    | RENAME COLUMN column_name TO new_column_name
    | ADD [SPATIAL] {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option [ index_option ...]]
    | ADD [CONSTRAINT [constraint_name]] PRIMARY KEY index_desc
    | ADD [CONSTRAINT [constraint_name]] UNIQUE [INDEX | KEY] [unique_index_name] index_desc
    | ADD [CONSTRAINT [constraint_name]] CHECK (expression) [[NOT] ENFORCED]
    | ADD [CONSTRAINT [constraint_name]] FOREIGN KEY [foreign_index_name] index_desc REFERENCES source_tbl_name (source_key_part) [match_action] [reference_option_list]
    | ALTER INDEX index_name {parallel_option | visibility_option}
    | ALTER {CHECK | CONSTRAINT} constraint_name [NOT] ENFORCED
    | DROP INDEX index_name
    | DROP PRIMARY KEY [, ADD PRIMARY KEY (column)]
    | DROP {CHECK | CONSTRAINT} constraint_name
    | DROP FOREIGN KEY fk_name
    | DROP TABLEGROUP
    | RENAME {INDEX | KEY} old_index_name TO new_index_name
    | RENAME [TO] new_table_name

table_options:
    table_option [table_option ...]

table_option:
    [DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name
    | [DEFAULT] COLLATE [=] collation_name
    | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
    | TABLEGROUP [=] tablegroup_name
    | BLOCK_SIZE integer
    | LOB_INROW_THRESHOLD [=] num
    | COMPRESSION [=] 'compression_value'
    | AUTO_INCREMENT [=] int_value
    | COMMENT 'string'
    | TTL (ttl_definition)
    | ROW_FORMAT [=] row_format_value
    | PCTFREE [=] num
    | parallel_option
    | DUPLICATE_SCOPE [=] 'none | cluster'
    | TABLE_MODE [=] 'table_mode_value'

compression_value:
    none
    | lz4_1.0
    | zstd_1.0
    | snappy_1.0

row_format_value:
    REDUNDANT
    | COMPACT
    | DYNAMIC
    | COMPRESSED
    | DEFAULT

parallel_option:
    NOPARALLEL
    | PARALLEL integer

table_mode_value:
    NORMAL
    | QUEUING
    | MODERATE
    | SUPER
    | EXTREME

column_definition:
    data_type [DEFAULT const_value] [AUTO_INCREMENT] [NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] [COMMENT 'string'] [ON UPDATE CURRENT_TIMESTAMP] [FIRST | {BEFORE column_name} | {AFTER column_name}]
    | data_type [GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED] [opt_generated_column_attribute] [FIRST | {BEFORE column_name} | {AFTER column_name}]

column_definition_list:
    column_name column_definition [, column_name column_definition ...]

index_type:
    USING BTREE

key_part:
    {index_col_name [(length)]
    | (expr)} [ASC]

index_option:
    [GLOBAL | LOCAL]
    | BLOCK_SIZE integer
    | COMPRESSION [=] 'compression_value'
    | STORING (column_name_list)
    | COMMENT 'string'

column_name_list:
    column_name [, column_name ...]

index_desc:
    (column_desc [, column_desc ...]) [index_type] [index_option [ index_option ...]]

column_desc:
    column_name [(length)] [ASC | DESC]

reference_option_list:
    reference_option [, reference_option ...]

reference_option:
    ON {DELETE | UPDATE} {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}

visibility_option:
    VISIBLE
    | INVISIBLE  

alter_partition_option:
    ADD PARTITION (partition_range_or_list)
    | DROP PARTITION partition_name_list
    | DROP SUBPARTITION subpartition_name_list
    | TRUNCATE PARTITION partition_name_list
    | TRUNCATE SUBPARTITION subpartition_name_list
    | modify_partition_info

partition_range_or_list:
    range_partition_element_list
    | list_partition_element_list

range_partition_element_list:
    range_partition_element [, range_partition_element ...]

range_partition_element:
    PARTITION partition_name VALUES LESS THAN (expr | MAXVALUE) [(subpartition_element)]

subpartition_element:
    range_subpartition_definition_list
    | list_subpartition_definition_list
    | hash_subpartition_definition_list
    | key_subpartition_definition_list

range_subpartition_definition_list:
    range_subpartition_definition [, range_subpartition_definition ...]

range_subpartition_definition:
    SUBPARTITION subpartition_name VALUES LESS THAN (expr | MAXVALUE)

list_subpartition_definition_list:
    list_subpartition_definition [, list_subpartition_definition ...]

list_subpartition_definition:
    SUBPARTITION subpartition_name VALUES IN (value_list | DEFAULT)

hash_subpartition_definition_list:
    hash_subpartition_definition [, hash_subpartition_definition ...]

hash_subpartition_definition:
    SUBPARTITION subpartition_name

key_subpartition_definition_list:
    key_subpartition_definition [, key_subpartition_definition ...]

key_subpartition_definition:
    SUBPARTITION subpartition_name

list_partition_element_list:
    list_partition_element [, list_partition_element ...]

list_partition_element:
    PARTITION partition_name VALUES IN (value_list | DEFAULT) [(subpartition_element)]

partition_name_list:
    partition_name [, partition_name ...]

subpartition_name_list:
    subpartition_name [, subpartition_name ...]

modify_partition_info:
    PARTITION BY RANGE {(expr) | COLUMNS(column_name_list)} [subpartition_option]
        {(range_partition_definition [(subpartition_definition)]
          [, range_partition_definition [(subpartition_definition)] ... ]
          )}
    | PARTITION BY LIST {(expr) | COLUMNS (column_name_list)} [subpartition_option]
          {(list_partition_definition [(subpartition_definition)]
            [, list_partition_definition [(subpartition_definition)] ...]
            )}
    | PARTITION BY HASH(expr) [subpartition_option]
          {(hash_partition_definition [(subpartition_definition)]
            [, hash_partition_definition [(subpartition_definition)] ...]
            )}
    | PARTITION BY KEY(column_name_list) [subpartition_option]
          {(key_partition_definition [(subpartition_definition)]
            [, key_partition_definition [(subpartition_definition)] ...]
            )}

subpartition_option:
    SUBPARTITION BY RANGE {(expr) | COLUMNS (column_name_list)}
    | SUBPARTITION BY LIST {(expr) | COLUMNS (column_name_list)}
    | SUBPARTITION BY HASH (expr)
    | SUBPARTITION BY KEY(column_name_list)

range_partition_definition:
    PARTITION partition_name VALUES LESS THAN (expr | MAXVALUE)

list_partition_definition:
    PARTITION partition_name VALUES IN (value_list | DEFAULT)

hash_partition_definition/key_partition_definition:
    PARTITION partition_name

subpartition_definition:
    range_subpartition_definition_list
    | list_subpartition_definition_list
    | hash_subpartition_definition_list
    | key_subpartition_definition_list

```

## 参数说明

| **参数** | **描述** |
| --- | --- |
| table_name | 指定表名称。 |
| alter_table_action_list | 表示表结构修改的操作列表，包括修改表属性、新增列、修改列属性、删除列和约束等。可以同时指定多个操作，使用英文逗号（`,`）分隔。详细介绍可参见下文 [alter_table_action](#alter_table_action)。 |
| alter_partition_option | 表示对表的分区进行操作，例如增加分区、删除分区和清除分区数据等。分区操作的详细介绍可参见下文 [alter_partition_option](#alter_partition_option)。 |

### alter_table_action

- `[SET] table_options`：用于设置表属性，例如如表的压缩算法、字符集、自增列的初始值等。可以设置多个表属性，表属性间使用英文逗号（`,`）分开。详细介绍可参见下文 [table_option](#table_option)。
 - `ADD [COLUMN] column_name column_definition`：用于增加一个新列，支持增加生成列。

     - `column_name`：指定列名称。
     - `column_definition`：指定列定义。有关列定义的详细介绍可参见下文 [column_definition](#column_definition)。

  **示例如下：**

     1. 创建表 `tbl1`。

       ```sql
       CREATE TABLE tbl1 (col1 INT(11) PRIMARY KEY, col2 VARCHAR(50), col3 VARCHAR(50));

       ```
     2. 在表 `tbl1` 中的 `col2` 之前增加一个生成列 c4，数据类型为 `VARCHAR(100)`，生成规则为拼接 `col2` 和 `col3` 的值。

       ```sql
       ALTER TABLE tbl1 ADD c4 VARCHAR(100) GENERATED ALWAYS AS (CONCAT(col2, ' ', col3)) VIRTUAL BEFORE col2;

       ```
     3. 执行 `DESCRIBE` 命令查看表 `tbl1` 信息。

       ```sql
       DESCRIBE tbl1;

       ```

       返回结果如下：

       ```shell
       +-------+--------------+------+------+---------------------------+-------------------+
       | Field | Type         | Null | Key  | Default                   | Extra             |
       +-------+--------------+------+------+---------------------------+-------------------+
       | col1  | int(11)      | NO   | PRI  | NULL                      |                   |
       | c4    | varchar(100) | YES  |      | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED |
       | col2  | varchar(50)  | YES  |      | NULL                      |                   |
       | col3  | varchar(50)  | YES  |      | NULL                      |                   |
       +-------+--------------+------+------+---------------------------+-------------------+
       4 rows in set

       ```
 - `ADD [COLUMN] (column_definition_list)`：用于一次增加多个新列。

     - `column_definition_list`：列定义列表，列定义包括列名和数据类型等。有关列定义的详细介绍可参见下文 [column_definition](#column_definition)。

  **示例如下：**

     1. 在表 `tbl1` 中同时增加 `c5` 和 `c6` 两列，数据类型为 `INT(1)`。

       ```sql
       ALTER TABLE tbl1 ADD (c5 INT(1), c6 INT(1));

       ```
     2. 执行 `DESCRIBE` 命令查看表 `tbl1` 信息。

       ```

       返回结果如下：

       ```shell
       +-------+--------------+------+------+---------------------------+-------------------+
       | Field | Type         | Null | Key  | Default                   | Extra             |
       +-------+--------------+------+------+---------------------------+-------------------+
       | col1  | int(11)      | NO   | PRI  | NULL                      |                   |
       | c4    | varchar(100) | YES  |      | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED |
       | col2  | varchar(50)  | YES  |      | NULL                      |                   |
       | col3  | varchar(50)  | YES  |      | NULL                      |                   |
       | c5    | int(1)       | YES  |      | NULL                      |                   |
       | c6    | int(1)       | YES  |      | NULL                      |                   |
       +-------+--------------+------+------+---------------------------+-------------------+
       6 rows in set

       ```
 - `ALTER [COLUMN] column_name {SET DEFAULT const_value | DROP DEFAULT}`：用于修改列的默认值。

     - `SET DEFAULT const_value`：用于设置列的默认值。
     - `DROP DEFAULT`：用于删除列的默认值。

  **示例如下：**

     1. 在表 `tbl1` 中设置列 `c5` 的默认值为 0。

       ```sql
       ALTER TABLE tbl1 ALTER c5 SET DEFAULT 0;

       ```

       返回结果如下：

       ```shell
       +-------+--------------+------+------+---------------------------+-------------------+
       | Field | Type         | Null | Key  | Default                   | Extra             |
       +-------+--------------+------+------+---------------------------+-------------------+
       | col1  | int(11)      | NO   | PRI  | NULL                      |                   |
       | c4    | varchar(100) | YES  |      | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED |
       | col2  | varchar(50)  | YES  |      | NULL                      |                   |
       | col3  | varchar(50)  | YES  |      | NULL                      |                   |
       | c5    | int(1)       | YES  |      | 0                         |                   |
       | c6    | int(1)       | YES  |      | NULL                      |                   |
       +-------+--------------+------+------+---------------------------+-------------------+
       6 rows in set

       ```
 - `DROP [COLUMN] column_name`：用于删除指定的列。

  **示例如下：**

     1. 删除表 `tbl1` 中的列 `c6`。

       ```sql
       ALTER TABLE tbl1 DROP c6;

       ```

       返回结果如下：

       ```shell
       +-------+--------------+------+------+---------------------------+-------------------+
       | Field | Type         | Null | Key  | Default                   | Extra             |
       +-------+--------------+------+------+---------------------------+-------------------+
       | col1  | int(11)      | NO   | PRI  | NULL                      |                   |
       | c4    | varchar(100) | YES  |      | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED |
       | col2  | varchar(50)  | YES  |      | NULL                      |                   |
       | col3  | varchar(50)  | YES  |      | NULL                      |                   |
       | c5    | int(1)       | YES  |      | 0                         |                   |
       +-------+--------------+------+------+---------------------------+-------------------+
       5 rows in set

       ```
 - `CHANGE [COLUMN] column_name new_column_name column_definition`：用于修改列名和列定义。有关列定义的详细介绍可参见下文 [column_definition](#column_definition)。

     - `new_column_name`：指定列的新名称。

  **示例如下：**

     1. 将表 `tbl1` 的列 `c5` 改名为 `col5`，并将数据类型改为 `VARCHAR(1)`

       ```sql
       ALTER TABLE tbl1 CHANGE COLUMN c5 col5 VARCHAR(1);

       ```

       返回结果如下：

       ```shell
       +-------+--------------+------+------+---------------------------+-------------------+
       | Field | Type         | Null | Key  | Default                   | Extra             |
       +-------+--------------+------+------+---------------------------+-------------------+
       | col1  | int(11)      | NO   | PRI  | NULL                      |                   |
       | c4    | varchar(100) | YES  |      | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED |
       | col2  | varchar(50)  | YES  |      | NULL                      |                   |
       | col3  | varchar(50)  | YES  |      | NULL                      |                   |
       | col5  | varchar(1)   | YES  |      | NULL                      |                   |
       +-------+--------------+------+------+---------------------------+-------------------+
       5 rows in set

       ```
 - `MODIFY [COLUMN] column_name column_definition`：用于修改列的定义。有关列定义的详细介绍可参见下文 [column_definition](#column_definition)。

  **示例如下：**

     1. 将表 `tbl1` 中列 `col5` 的数据类型改为 `INT(1)`，并设置为非空。

       ```sql
       ALTER TABLE tbl1 MODIFY col5 INT(1);

       ```

       返回结果如下：

       ```shell
       +-------+--------------+------+------+---------------------------+-------------------+
       | Field | Type         | Null | Key  | Default                   | Extra             |
       +-------+--------------+------+------+---------------------------+-------------------+
       | col1  | int(11)      | NO   | PRI  | NULL                      |                   |
       | c4    | varchar(100) | YES  |      | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED |
       | col2  | varchar(50)  | YES  |      | NULL                      |                   |
       | col3  | varchar(50)  | YES  |      | NULL                      |                   |
       | col5  | int(1)       | NO   |      | NULL                      |                   |
       +-------+--------------+------+------+---------------------------+-------------------+
       5 rows in set

       ```
 - `RENAME COLUMN column_name TO new_column_name`：用于重命名列。该语法不改变列定义，仅修改列名。如果目标名称在表中已经存在，那么 `RENAME COLUMN` 执行会报错，但是重命名为原名称则不会报错。

     - 如果重命名的列上建有索引，`RENAME COLUMN` 可以正常执行，索引定义会自动级联修改。
     - 如果重命名列被前缀索引引用，`RENAME COLUMN` 可以正常执行，前缀索引支持级联修改。
     - 如果重命名的列上建有外键约束，`RENAME COLUMN` 可以正常执行，外键约束会自动级联修改。

  OceanBase 数据库在以下场景，不支持修改或者不会自动级联修改：

     - 重命名的列被生成列表达式引用，不支持修改列名，执行会报错。
     - 重命名的列被分区表达式引用，不支持修改列名，执行会报错。
     - 重命名的列被 `CHECK` 约束引用，不支持修改列名，执行会报错。
     - 重命名的列被函数索引引用，不支持修改列名，执行会报错。
     - 重命名的列被视图引用，`RENAME COLUMN` 执行成功，查询视图会报错，需要用户手动修改视图定义。
     - 重命名的列被存储过程引用，`RENAME COLUMN` 执行成功，`CALL` Procedure 报错，需要用户手动修改。

  **示例如下：**

       ```sql
       ALTER TABLE tbl1 RENAME COLUMN c4 TO col4;

       ```

       返回结果如下：

       ```shell
       +-------+--------------+------+------+---------------------------+-------------------+
       | Field | Type         | Null | Key  | Default                   | Extra             |
       +-------+--------------+------+------+---------------------------+-------------------+
       | col1  | int(11)      | NO   | PRI  | NULL                      |                   |
       | col4  | varchar(100) | YES  |      | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED |
       | col2  | varchar(50)  | YES  |      | NULL                      |                   |
       | col3  | varchar(50)  | YES  |      | NULL                      |                   |
       | col5  | int(1)       | NO   |      | NULL                      |                   |
       +-------+--------------+------+------+---------------------------+-------------------+
       5 rows in set

       ```
 - `ADD [SPATIAL] {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option [ index_option ...]]`：用于添加索引。

     - `SPATIAL`：指定创建的索引为空间索引。更多有关空间索引的介绍和限制信息，参见 [空间索引](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221018)。
     - `INDEX | KEY`：为创建的表指定键或索引。这两个关键词是等价的。
     - `index_name`：可选项，指定索引名称。如果不指定索引名，则会使用索引引用的第一列作为索引名，如果命名存在重复，则会使用下划线（_）+ 序号的方式命名。（例如，使用 `c1` 列创建的索引如果命名重复，则会将索引命名为 `c1_2`。） 您可以通过 `SHOW INDEX` 语句查看表上的索引。
     - `index_type`：可选项，用来指定索引使用的索引类型。
     - `key_part`：指定索引要包含的列名或表达式。

           - `index_col_name [(length)]`：指定表中的列作为索引列，并可以通过可选的 `length` 参数指定索引列的长度。例如，可以使用 `id(10)` 来指定 `id` 列作为索引列，并且只使用该列的前 10 个字符作为索引。
           - `expr`：表示合法的函数索引表达式，且允许是布尔表达式，例如 `c1=c1`。在 OceanBase 数据库的 MySQL 模式中，对函数索引的表达式进行了限制，禁止部分系统函数的表达式作为函数索引，具体的函数列表请参见 [函数索引支持的系统函数列表](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220209) 和 [函数索引不支持的系统函数列表](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220207)。

            #### 注意

            OceanBase 数据库当前版本禁止创建生成列上的函数索引。
           - `ASC`：可选项，表示按升序排序，目前暂不支持降序（`DESC`）排列。
     - `index_option`：可选项，指定索引选项列表。创建索引时可以指定多个索引选项，索引选项间使用英文空格分开，具体如下：

           - `GLOBAL`：表示创建全局索引。
           - `LOCAL`：表示创建局部索引，为默认值。
           - `BLOCK_SIZE integer`：指定索引块的大小，即每个索引块中的字节数。
           - `STORING(column_name_list)`：指定要存储在索引中的列，多个列间使用英文逗号（`,`）分开。
           - `COMMENT 'string'`：为索引添加注释。

  **示例如下：**

     1. 在 `tbl1` 表上创建索引 `idx1_tbl1`，引用 `col2`、`col3` 列。

       ```sql
       ALTER TABLE tbl1 ADD INDEX idx1_tbl1 (col2, col3);

       ```
     2. 通过 `SHOW INDEX` 语句查看在 `tbl1` 表上创建的索引。

       ```sql
       SHOW INDEX FROM tbl1;

       ```

       返回结果如下：

       ```shell
       +-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
       | Table | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment   | Index_comment | Visible | Expression |
       +-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
       | tbl1  |          0 | PRIMARY   |            1 | col1        | A         |        NULL | NULL     | NULL   |      | BTREE      | available |               | YES     | NULL       |
       | tbl1  |          1 | idx1_tbl1 |            1 | col2        | A         |        NULL | NULL     | NULL   | YES  | BTREE      | available |               | YES     | NULL       |
       | tbl1  |          1 | idx1_tbl1 |            2 | col3        | A         |        NULL | NULL     | NULL   | YES  | BTREE      | available |               | YES     | NULL       |
       +-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
       3 rows in set

       ```
 - `ADD [CONSTRAINT [constraint_name]] PRIMARY KEY index_desc`：用于添加主键约束。可以指定一个或多个列作为主键。如果是多个列，它们将组成复合主键。主键指定约束名时，仅语法上支持，功能不生效。

  **示例如下：**

     1. 创建表 `tbl2`。

       ```sql
       CREATE TABLE tbl2 (col1 INT, col2 INT, col3 VARCHAR(50));

       ```
     2. 向表 `tbl2` 添加一个主键约束，该主键约束由列 `col1` 定义。

       ```sql
       ALTER TABLE tbl2 ADD PRIMARY KEY (col1);

       ```
     3. 执行 `DESCRIBE` 命令查看表 `tbl2` 信息。

       ```sql
       DESCRIBE tbl2;

       ```

       返回结果如下：

       ```shell
       +-------+-------------+------+------+---------+-------+
       | Field | Type        | Null | Key  | Default | Extra |
       +-------+-------------+------+------+---------+-------+
       | col1  | int(11)     | NO   | PRI  | NULL    |       |
       | col2  | int(11)     | YES  |      | NULL    |       |
       | col3  | varchar(50) | YES  |      | NULL    |       |
       +-------+-------------+------+------+---------+-------+
       3 rows in set

       ```
 - `ADD [CONSTRAINT [constraint_name]] UNIQUE [INDEX | KEY] [unique_index_name] index_desc`：用于添加唯一性约束。

     - `unique_index_name`：可选项，指定唯一约束名称。

  **示例如下：**

     1. 向表 `tbl2` 添加一个唯一约束，该唯一约束由列 `col2` 定义。

       ```sql
       ALTER TABLE tbl2 ADD UNIQUE unique1_tbl2 (col2);

       ```
     2. 执行 `DESCRIBE` 命令查看表 `tbl2` 信息。

       ```

       返回结果如下：

       ```shell
       +-------+-------------+------+------+---------+-------+
       | Field | Type        | Null | Key  | Default | Extra |
       +-------+-------------+------+------+---------+-------+
       | col1  | int(11)     | NO   | PRI  | NULL    |       |
       | col2  | int(11)     | YES  | UNI  | NULL    |       |
       | col3  | varchar(50) | YES  |      | NULL    |       |
       +-------+-------------+------+------+---------+-------+
       3 rows in set

       ```
 - `ADD [CONSTRAINT [constraint_name]] CHECK (expression) [[NOT] ENFORCED]`：用于添加表的检查约束，限制列中的值的范围。

  **示例如下：**

  向表 `tbl2` 添加一个 `CHECK` 约束，约束的条件是 `col2` 的值必须大于 5 才能满足约束。

  ```sql
  ALTER TABLE tbl2 ADD CONSTRAINT check1_tbl2 CHECK (col2 > 5);

  ```
 - `ADD [CONSTRAINT [constraint_name]] FOREIGN KEY [foreign_index_name] index_desc REFERENCES source_tbl_name (source_key_part) [match_action] [reference_option_list]`：用于添加外键约束。

     - `foreign_index_name`：可选项，指定外键约束名称。如果不指定外键名，则会使用 表名 + `OBFK` + 创建时间命名。（例如，在 2021 年 8 月 1 日 00:00:00 为 `t1` 表创建的外键名称为 `t1_OBFK_1627747200000000`）。
     - `source_tbl_name`: 指定外键引用的源表的名称。
     - `source_key_part`: 指定与目标表建立关联的源表列名称。
     - `opt_reference_option_list`：用于指定外键引用选项列表，包括在引用表更新或删除时采取的动作。外键允许跨表交叉引用相关数据，当 `UPDATE` 或 `DELETE` 操作影响与子表相匹配行的父表中键值时，其结果取决于 `ON UPDATE` 和 `ON DELETE` 子句的引用操作：

           - `CASCADE`：表示从父表中删除或更新行，并自动删除或更新子表中匹配的行。
           - `SET NULL`：表示从父表中删除或更新行，并将子表中的外键列设置为 `NULL`。
           - `RESTRICT`：表示拒绝对父表的删除或更新操作。
           - `NO ACTION`：指定延迟检查。
           - `SET DEFAULT`：当父表中的引用项被删除时，子表中对应的外键列会被设置为默认值。

  **示例如下：**

  为表 `tbl2` 添加外键约束 `fk1_tbl2`，该外键约束指定了表中的 `col2` 列作为外键，它引用了 `tbl1` 表中的 `col1` 列。在更新 `tbl1` 中的数据时，如果主键列（`col1`）发生变化，那么 `tbl2` 中的外键列（`col2`）将被设置为 `NULL`。

  ```sql
  ALTER TABLE tbl2 ADD CONSTRAINT fk1_tbl2 FOREIGN KEY (col2) REFERENCES tbl1(col1) ON UPDATE SET NULL;

  ```
 - `ALTER INDEX index_name {parallel_option | visibility_option}`：用于修改索引，可以设置索引的并行选项或者可见性选项。

     - `NOPARALLEL`：并行度为 `1`，默认配置。
     - `PARALLEL integer`：指定并行度，`integer` 取值大于等于 `1`。
     - `VISIBLE`：修改索引可见。
     - `INVISIBLE`：修改索引不可见，SQL 优化器将不会选择该索引。

  **示例如下：**

  修改表 `tbl1` 中索引 `idx1_tbl1` 的并行度为 3。

  ```sql
  ALTER TABLE tbl1 ALTER INDEX idx1_tbl1 PARALLEL 3;

  ```
 - `ALTER {CHECK | CONSTRAINT} constraint_name [NOT] ENFORCED`：用于修改表中的约束（`CHECK` 或`CONSTRAINT`）是否被强制执行的设置。
 - `DROP INDEX index_name`：用于删除指定的索引。

  #### 注意

     - 由于已有实现中同时添加和删除索引的功能是非原子的，可能导致系统在一段时间内无索引可用的状态（例如，为了将索引 `idx1_tbl1(col1, col2)` 修改为 `idx1_tbl2(col1, col2, col3)`，在执行`ALTER TABLE tbl1 DROP INDEX idx1_tbl1, ADD INDEX idx1_tbl2(col1, col2, col3);` 时，会先删除原有索引 `idx1_tbl1`，然后再创建索引 `idx1_tbl2`，在这过程中会出现一段时间内 `idx1_tbl1` 不存在，`idx1_tbl2` 也未被创建好），因此从 OceanBase 数据库 V4.2.1 BP10 版本开始，该操作已禁用。
     - 可以通过使用命令 `ALTER SYSTEM SET _enable_drop_and_add_index = true;` 来打开配置项，从而允许在一条 SQL 语句中同时执行添加和删除索引操作，此操作需谨慎使用。

  **示例如下：**

  删除表 `tbl1` 中的索引 `idx1_tbl1`。

  ```sql
  ALTER TABLE tbl1 DROP INDEX idx1_tbl1;

  ```
 - `DROP PRIMARY KEY [, ADD PRIMARY KEY (column)]`：用于删除主键，并且可以重新添加新的主键。

  **示例如下：**

     1. 删除表 `tbl1` 的主键，并且重新添加主键。

       ```sql
       ALTER TABLE tbl1 DROP PRIMARY KEY, ADD PRIMARY KEY(col2);

       ```

       返回结果如下：

       ```shell
       +-------+--------------+------+------+---------------------------+-------------------+
       | Field | Type         | Null | Key  | Default                   | Extra             |
       +-------+--------------+------+------+---------------------------+-------------------+
       | col1  | int(11)      | NO   |      | NULL                      |                   |
       | col4  | varchar(100) | YES  |      | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED |
       | col2  | varchar(50)  | NO   | PRI  | NULL                      |                   |
       | col3  | varchar(50)  | YES  |      | NULL                      |                   |
       | col5  | int(1)       | NO   |      | NULL                      |                   |
       +-------+--------------+------+------+---------------------------+-------------------+
       5 rows in set

       ```
 - `DROP {CHECK | CONSTRAINT} constraint_name`：用于删除指定的约束（`CHECK` 或`CONSTRAINT`）。

  **示例如下：**

  删除表 `tbl2` 中的 `CHECK` 约束 `check1_tbl2`。

  ```sql
  ALTER TABLE tbl2 DROP CHECK check1_tbl2;

  ```
 - `DROP FOREIGN KEY fk_name`：用于删除指定的外键。

  **示例如下：**

  删除表 `tbl2` 中的外键约束 `fk1_tbl2`。

  ```sql
  ALTER TABLE tbl2 DROP FOREIGN KEY fk1_tbl2;

  ```
 - `DROP TABLEGROUP`：用于删除表组。

  **示例如下：**

  删除表 `tbl2` 的所属表组。

  ```sql
  ALTER TABLE tbl2 DROP TABLEGROUP;

  ```
 - `RENAME {INDEX | KEY} old_index_name TO new_index_name`：用于重命名索引。
 - `RENAME [TO] new_table_name`：用于重命名表。

  **示例如下：**

  将表 `tbl2` 的名称改为 `tbl_2`。

  ```sql
  ALTER TABLE tbl2 RENAME tbl_2;

  ```

#### table_option

- `[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name`：指定表的默认字符集。OceanBase 数据库 MySQL 模式可使用字符集的详细信息，参见 [字符集](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222178)。
 - `[DEFAULT] COLLATE [=] collation_name`：指定表的默认字符序。OceanBase 数据库 MySQL 模式可使用字符序的详细信息，参见 [字符序](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222182)。
 - `CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]`：指定表的默认字符集和字符序。
 - `TABLEGROUP [=] tablegroup_name`：指定表所属的表组。
 - `BLOCK_SIZE integer`：指定表的微块大小。
 - `LOB_INROW_THRESHOLD [=] num`：用于配置 `INROW` 阈值，当 LOB 数据大小超过该阈值时，会转为 `OUTROW` 存储在 LOB Meta 表中，默认为 4KB。有关 LOB 类型的介绍信息，参见 [LOB 类型](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000407832)。
 - `COMPRESSION [=] 'compression_value'`：指定表的压缩算法。取值如下：

     - `none`：不使用压缩算法。
     - `lz4_1.0`：使用 `lz4` 压缩算法。
     - `zstd_1.0`：使用 `zstd` 压缩算法。
     - `snappy_1.0`: 使用 `snappy` 压缩算法。
 - `AUTO_INCREMENT [=] int_value`：指定表中自增列的初始值（起始值）。
 - `COMMENT 'string'`：指定表注释。不区分大小写。
 - `TTL (ttl_definition)`：Time To Live，指定删除过期数据。更多介绍信息，参见 [过期数据删除功能](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001177723)。
 - `ROW_FORMAT [=] row_format_value`：指定表是否开启 Encoding 存储格式。取值如下：

     - `REDUNDANT`：不开启 Encoding 存储格式。
     - `COMPACT`：不开启 Encoding 存储格式。
     - `DYNAMIC`：Encoding 存储格式。
     - `COMPRESSED`：Encoding 存储格式。
     - `DEFAULT`：等价 `dynamic` 模式。
 - `PCTFREE [=] num`：指定宏块保留空间百分比。
 - `parallel_option`：指定表级别的并行度。取值如下：

     - `NOPARALLEL`：并行度为 `1`，默认配置。
     - `PARALLEL integer`：指定并行度，`integer` 取值大于等于 `1`。

  **示例如下：**

  修改表 `tbl1` 的并行度为 `2`。

  ```sql
  ALTER TABLE tbl1 PARALLEL 2;

  ```
 - `DUPLICATE_SCOPE [=] 'none | cluster'`：指定复制表的属性。取值如下：

     - `none`：表示该表是一个普通表，为默认值。
     - `cluster`：表示该表是一个复制表，Leader 需要将事务复制到当前租户的所有 F（全能）副本及 R（只读）副本。OceanBase 数据库目前仅支持 `cluster` 级别的复制表。

  有关复制表的详细信息，参见 [创建表](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220219) 下 **创建复制表** 章节。
 - `TABLE_MODE [=] 'table_mode_value'`：指定合并触发阈值与合并策略，即控制数据转储后的合并行为。取值如下：

  #### 说明

  在以下列出的 `TABLE_MODE` 模式中，除了 `NORMAL` 模式之外，所有模式都代表 `QUEUING` 表。这种 `QUEUING` 表是最基本的表类型，并且随后列出的几种模式（除了 NORMAL 模式）代表了使用更加积极的合并策略。

     - `NORMAL`：默认值，表示正常。在该模式下，数据转储后触发合并的概率极低。
     - `QUEUING`：在该模式下，数据转储后触发合并的概率低。
     - `MODERATE`：表示适度。在该模式下，数据转储后触发合并的概率为中等。
     - `SUPER`：表示超级。在该模式下，数据转储后触发合并的概率高。
     - `EXTREME`：表示极端。在该模式下，转储后触发合并的概率较高。

  更多有关合并的信息，请参见 [自适应合并](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000488719)。

#### column_definition

- `data_type [DEFAULT const_value] [AUTO_INCREMENT] [NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] [COMMENT 'string'] [FIRST | {BEFORE column_name} | {AFTER column_name}]`：普通列的列定义。

     - `data_type`：指定列的数据类型，例如整数、文本、日期等。OceanBase 数据库 MySQL 模式支持的数据类型及详细说明，参见 [数据类型概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222199)。
     - `[DEFAULT const_value]`：可选项，指定列的默认值。
     - `[AUTO_INCREMENT]`：可选项，指定该列是否为自增列。当前仅数据类型为整数类型的数据列（`BOOL`/`BOOLEAN` 类型除外）可以设置为自增列。OceanBase 数据库支持使用自增列作为分区键。更多自增列的介绍，参见 [定义自增列](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220211)。
     - `[NULL | NOT NULL]`：可选项，指定列的值是否可以为 `NULL` 或 `NOT NULL`。如果未指定，则默认为 `NULL`。
     - `[[PRIMARY] KEY]`：可选项，指定该列作为主键，如果指定为主键，则该列的值必须是唯一的且不为空。
     - `[UNIQUE [KEY]]`：可选项，指定该列为唯一键，保证该列的值是唯一的。
     - `[COMMENT 'string']`：可选项，指定列注释。
     - `[FIRST | {BEFORE column_name} | {AFTER column_name}]`：可选项，指定新增列的位置。如果不指定该参数，默认新增列的位置在末尾。

           - `FIRST`：表示将新增列添加到表的最开始位置。
           - `BEFORE column_name`：表示将新增列添加到指定的列之前位置。
           - `AFTER column_name`：表示将新增列添加到指定的列之后位置。  

      #### 说明

      当前 OceanBase 数据库仅支持在 `ADD COLUMN` 语法中设置列的位置。
 - `data_type [GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED] [opt_generated_column_attribute] [FIRST | {BEFORE column_name} | {AFTER column_name}]`：生成列的列定义。

     - `data_type`：新列的数据类型。
     - `[GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED]`：创建生成列。

           - `[GENERATED ALWAYS] AS (expr)`：指定计算新列值的表达式。
           - `[VIRTUAL | STORED]`：指定生成列是虚拟列还是存储列。

                   - `VIRTUAL`：列值不会被存储，而是在读取行时，在任何 `BEFORE` 触发器之后立即计算。虚拟列不占用存储空间。
                   - `STORED`：在插入或更新行时评估和存储列值。存储列确实需要存储空间并且可以被索引。
     - [opt_generated_column_attribute]：指定生成列的其他属性，例如列的注释。

### alter_partition_option

有关分区类型的详细介绍，参见 [分区概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220228)。

- `ADD PARTITION (partition_range_or_list)`：用于向表中添加一级分区。更多有关新增分区的信息，参见 [添加分区](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220225)。

  #### 注意

  对于非模板化二级分区表，添加一级分区时，需要同时指定一级分区的定义和该一级分区下的二级分区定义。

  **示例如下：**

     1. 创建分区表 `tbl3`。

       ```sql
       CREATE TABLE tbl3(col1 INT, col2 TIMESTAMP, col3 INT)
           PARTITION BY RANGE(col1)
           SUBPARTITION BY RANGE(UNIX_TIMESTAMP(col2))
           (PARTITION p0 VALUES LESS THAN(100)
             (SUBPARTITION sp0 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')),
             SUBPARTITION sp1 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01')),
             SUBPARTITION sp2 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')),
             SUBPARTITION sp3 VALUES LESS THAN(UNIX_TIMESTAMP('2022/01/01'))
               ),
           PARTITION p1 VALUES LESS THAN(200)
             (SUBPARTITION sp4 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')),
               SUBPARTITION sp5 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01')),
               SUBPARTITION sp6 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')),
               SUBPARTITION sp7 VALUES LESS THAN(UNIX_TIMESTAMP('2022/01/01'))
               )
           );

       ```
     2. 向表 `tbl3` 中添加一级分区 `p3` 和 `p4`。

       ```sql
       ALTER TABLE tbl3
           ADD PARTITION
           (PARTITION p3 VALUES LESS THAN(300)
             (SUBPARTITION sp8 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')),
             SUBPARTITION sp9 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01'))
               ),
           PARTITION p4 VALUES LESS THAN(400)
             (SUBPARTITION sp10 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')),
               SUBPARTITION sp11 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')),
               SUBPARTITION sp12 VALUES LESS THAN(UNIX_TIMESTAMP('2021/12/01'))
               )
           );

       ```
 - `DROP PARTITION partition_name_list`：用于删除表中指定的一级分区。更多有关删除分区的信息，参见 [删除分区](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220227)。

  **示例如下：**

  删除表 `tbl3` 中的一级分区 `p3` 和 `p4`。

  ```sql
  ALTER TABLE tbl3 DROP PARTITION p3, p4;

  ```
 - `DROP SUBPARTITION subpartition_name_list`：用于删除表中指定的二级分区。

  **示例如下：**

  删除表 `tbl3` 中的二级分区 `sp6` 和 `sp7`。

  ```sql
  ALTER TABLE tbl3 DROP SUBPARTITION sp6, sp7;

  ```
 - `TRUNCATE PARTITION partition_name_list`：用于清空指定一级分区内的数据。更多有关清空分区数据的信息，参见 [Truncate 分区](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220232)。

  **示例如下：**

  清除表 `tbl3` 一级分区 `p0` 和 `p1` 中的数据。

  ```sql
  ALTER TABLE tbl3 TRUNCATE PARTITION p0, p1;

  ```
 - `TRUNCATE SUBPARTITION subpartition_name_list`：用于清空指定二级分区内的数据。

  **示例如下：**

  清除表 `tbl3` 二级分区 `sp0` 和 `sp1` 中的数据。

  ```sql
  ALTER TABLE tbl3 TRUNCATE SUBPARTITION sp0, sp1;

  ```
 - `modify_partition_info`：用于修改分区规则（重分区），即修改表的分区方式和分区类型。更多修改分区规则的信息，参见 [修改分区规则](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220230)。

  **示例如下：**

  将表 `tbl3` 的分区方式由 Range + Range 改为 Range + List。

  ```sql
  ALTER TABLE tbl3
      PARTITION BY RANGE(col1)
      SUBPARTITION BY LIST(col3)
      (PARTITION p0 VALUES LESS THAN(100)
        (SUBPARTITION sp0 VALUES IN (1, 2, 3),
        SUBPARTITION sp1 VALUES IN (5, 6)
        ),
      PARTITION p1 VALUES LESS THAN(200)
        (SUBPARTITION sp2 VALUES IN (1, 2, 3),
        SUBPARTITION sp3 VALUES IN (5, 6)
        )
      );

  ```

## 相关文档

- [更改表](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220212)
 - [CREATE TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221429)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
