---
title: "更改表 - OceanBase 数据库 V4.5.0 | OceanBase 文档中心"
description: 更改表 表创建成功后，您可以使用 ALTER TABLE 语句对表进行修改。 更改表的 Collation 和字符集 创建表时，如果未明确定义表的 Collation 和字符集，则默认使用数据库的字符集和字符序，数据库的 Collation 和字符集的详细介绍信息请参见 数据库级字符集和字符序 。 表创建后，您可以修…
---
切换语言

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

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

# 更改表

更新时间：2026-02-23 09:56:13

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/700.reference/300.database-object-management/100.manage-object-of-mysql-mode/200.manage-tables-of-mysql-mode/600.change-table-of-mysql-mode.md)  

表创建成功后，您可以使用 `ALTER TABLE` 语句对表进行修改。

## 更改表的 Collation 和字符集

创建表时，如果未明确定义表的 Collation 和字符集，则默认使用数据库的字符集和字符序，数据库的 Collation 和字符集的详细介绍信息请参见 [数据库级字符集和字符序](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004480819)。

表创建后，您可以修改表的 Collation 和字符集设置。 语句如下：

```sql
ALTER TABLE table_name [[DEFAULT] CHARACTER SET [=] charset_name] [COLLATE [=] collation_name];

```

OceanBase 数据库中表的 Collation 和字符集的详细介绍信息请参见 [表级字符集和字符序](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004480814)。

#### 注意

修改表的 Collation 和字符集设置仅影响后续添加的字符类型的列的数据保存方式，已有字符类型的列的数据保存方式不会被修改。

示例：

1. 创建表 `tbl1`。

   ```sql
   obclient> CREATE TABLE tbl1 (c1 int, c2 varchar(32), c3 varchar(32), PRIMARY KEY(c1), UNIQUE KEY uk1(c2));

   ```
 2. 修改表的 Collation 和字符集。

   ```sql
   obclient> ALTER TABLE tbl1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;

   ```

   如果表中已有数据，您可以修改表中已有数据的 Collation 和字符集，并将表的 Collation 和字符集也修改为对应的设置。示例如下：

   ```sql
   obclient> ALTER TABLE tbl1 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

   ```

## 更改表结构

OceanBase 数据库支持增加列、修改列及其属性、删除列等。

### 增加列

在表中增加列，但不支持直接增加主键列。如果需要增加主键列，可以先增加列后再为列添加主键。添加主键的相关操作请参见 [定义列的约束类型](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476738)。

假设有一表 `test`，其表结构如下所示。

```shell
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1    | int(11)     | NO   | PRI | NULL    |       |
| c2    | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set

```

- 添加任意列 `c3`。

  ```sql
  obclient> ALTER TABLE test ADD c3 int;

  ```

  修改后，执行语句 `DESCRIBE test` 查询表结构，结果如下。

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

  ```
 - 在 `c1` 列后面指定添加 `c4` 列。

  ```sql
  obclient> ALTER TABLE test ADD COLUMN c4 INT NULL AFTER c1;

  ```

  ```shell
  +-------+-------------+------+-----+---------+-------+
  | Field | Type        | Null | Key | Default | Extra |
  +-------+-------------+------+-----+---------+-------+
  | c1    | int(11)     | NO   | PRI | NULL    |       |
  | c4    | int(11)     | YES  |     | NULL    |       |
  | c2    | varchar(50) | YES  |     | NULL    |       |
  | c3    | int(11)     | NO   |     | NULL    |       |
  +-------+-------------+------+-----+---------+-------+
  4 rows in set

  ```
 - 在 `c1` 列前面指定添加 `c6` 列。

  ```sql
  obclient> ALTER TABLE test ADD COLUMN c6 INT NULL BEFORE c1;

  ```

  ```shell
  +-------+-------------+------+-----+---------+-------+
  | Field | Type        | Null | Key | Default | Extra |
  +-------+-------------+------+-----+---------+-------+
  | c6    | int(11)     | YES  |     | NULL    |       |
  | c1    | int(11)     | NO   | PRI | NULL    |       |
  | c4    | int(11)     | YES  |     | NULL    |       |
  | c2    | varchar(50) | YES  |     | NULL    |       |
  | c3    | int(11)     | NO   |     | NULL    |       |
  +-------+-------------+------+-----+---------+-------+
  5 rows in set

  ```

  显示的字段解释如下：

     - `Field`：字段信息为列名。
     - `Type`：该列的数据类型。
     - `Null`：表示该列是否允许为空，`NO` 表示不允许为空，`YES` 表示允许为空。
     - `key`：字段信息显示为 `PRI` 代表改列为主键列。

### 修改列属性

支持重命名列、修改列类型、列的默认值和修改列的 Skip Index 属性。

#### 重命名列

使用 `RENAME COLUMN` 关键字重命名列时，需要注意以下事项：

- 如果待重命名的列上有索引或者外键约束，列名可以修改成功，并且索引定义和外键约束会自动级联修改。
 - 如果待重命名的列被视图或存储过程引用，列名可以修改成功，但需要手动修改视图或存储过程的定义。
 - 不支持同时进行重命名列和删除列的操作。
 - 不支持同时进行重命名列与修改分区（增加分区、删除分区等）的操作。

```

将表 `test` 的 `c2` 列重命名为 `c` 的示例如下。

```sql
obclient> ALTER TABLE test RENAME COLUMN c2 TO c;

```

```shell
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1    | int(11)     | NO   | PRI | NULL    |       |
| c     | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set

```

注意，以下场景下，重命名列会失败：

- 目标列名在当前表中已存在。

  有一个特殊场景，如果重命名的列出现了循环的场景，可以重命名成功。例如，本示例中，将原 `c1` 列重命名为 `c2`,同时将原 `c2` 列重命名为 `c1`，执行语句 `ALTER TABLE test RENAME COLUMN c1 TO c2, rename column c2 TO c1;`，可以重命名成功。
 - 待重命名的列被生成列表达式引用。
 - 待重命名的列被分区表达式引用。
 - 待重命名的列被 CHECK 约束引用。

#### 修改列类型

OceanBase 数据库中 MySQL 模式下列类型的转换规则及详细信息请参见 [列类型变更规则](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479642)。

```

将表 `test` 的 `c2` 列修改为 CHAR 类型的示例如下。

```sql
obclient> ALTER TABLE test MODIFY c2 CHAR(60);

```

```shell
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1    | int(11)     | NO   | PRI | NULL    |       |
| c2    | char(60)    | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set

```

#### 修改列名同时修改列类型

假设有一表 `test`，其表结构如下所示。

```

将表 `test` 的 `c2` 列重命名为 `c` 并将其数据类型修改为 CHAR 类型的示例如下。

```sql
obclient> ALTER TABLE test CHANGE COLUMN c2 c CHAR(60);

```

```shell
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1    | int(11)     | NO   | PRI | NULL    |       |
| c     | char(60)    | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set

```

#### 修改列的默认值

修改列的 `default` 值为 `2` 的示例如下：

```sql
obclient> ALTER TABLE test CHANGE COLUMN c c2 varchar(50) DEFAULT 2;

```

```shell
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1    | int(11)     | NO   | PRI | NULL    |       |
| c2    | varchar(50) | YES  |     | 2       |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set

```

或者您也可以通过以下语句修改列的默认值。

```sql
ALTER TABLE table_name ALTER [COLUMN] column_name {SET DEFAULT const_value | DROP DEFAULT}

```

#### 修改列的 Skip Index 属性

OceanBase 数据库支持使用 `ALTER TABLE` 语句添加、修改和删除 Skip Index 属性。

更多有关 Skip Index 的信息，请参见 [列 Skip Index 属性](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476734)。

**示例如下：**

1. 使用下面 SQL 语句创建表 `test_skidx`。

   ```sql
   CREATE TABLE test_skidx(
     col1 INT SKIP_INDEX(MIN_MAX, SUM),
     col2 FLOAT SKIP_INDEX(MIN_MAX),
     col3 VARCHAR(1024) SKIP_INDEX(MIN_MAX),
     col4 CHAR(10)
     );

   ```
 2. 修改表 `test_skidx` 中列 `col2` 的 Skip Index 属性为 `SUM` Skip Index 类型。

   ```sql
   ALTER TABLE test_skidx MODIFY COLUMN col2 FLOAT SKIP_INDEX(SUM);

   ```
 3. 建表后新增列的 Skip Index 属性。为表 `test_skidx` 中列 `col4` 增加的 `MIN_MAX` Skip Index 类型。

   ```sql
   ALTER TABLE test_skidx MODIFY COLUMN col4 CHAR(10) SKIP_INDEX(MIN_MAX);

   ```
 4. 建表后删除列的 Skip Index 属性。删除表 `test_skidx` 中列 `col1` 的 Skip Index 属性。

   ```sql
   ALTER TABLE test_skidx MODIFY COLUMN col1 INT SKIP_INDEX();

   ```

   或

   ```sql
   ALTER TABLE test_skidx MODIFY COLUMN col1 INT;

   ```

### 修改列的 Collation 和字符集

如果添加列时，未在各个列的定义中指定列的字符集和字符序，则各个列将默认使用表的字符集和字符序。您可以根据业务需要，修改各个列的 Collation 和字符集设置。

假设有表 `tbl1` 的建表语句如下。

```

修改表 `tbl1` 中 `c2` 列的 Collation 的示例如下：

```sql
obclient> ALTER TABLE tbl1 MODIFY COLUMN c2 varchar(32) COLLATE utf8mb4_bin;

```

OceanBase 数据库中，列的 Collation 和字符集的详细介绍信息请参见 [列级字符集和字符序](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004480817)。

### 删除列

支持删除表中的普通列和含索引的列，但不允许删除主键列。

```shell
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1    | int(11)  | NO   | PRI | NULL    |       |
| c     | char(60) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set

```

- 删除表中的普通列。

  ```

  执行以下语句，删除 `c` 列。

  ```sql
  obclient> ALTER TABLE test DROP c;

  ```

  删除后，执行语句 `DESCRIBE test` 查询表结构，结果如下。

  ```shell
  +-------+---------+------+-----+---------+-------+
  | Field | Type    | Null | Key | Default | Extra |
  +-------+---------+------+-----+---------+-------+
  | c1    | int(11) | NO   | PRI | NULL    |       |
  +-------+---------+------+-----+---------+-------+
  1 row in set

  ```
 - 删除表中含索引的列。

  ```shell
  +-------+-------------+------+-----+---------+-------+
  | Field | Type        | Null | Key | Default | Extra |
  +-------+-------------+------+-----+---------+-------+
  | c1    | int(11)     | NO   | PRI | NULL    |       |
  | c2    | varchar(32) | YES  | MUL | NULL    |       |
  | c3    | varchar(32) | YES  |     | NULL    |       |
  +-------+-------------+------+-----+---------+-------+
  3 rows in set

  ```

  执行以下语句，删除 `c2` 列。

  ```sql
  obclient> ALTER TABLE test DROP c2;

  ```

  ```shell
  +-------+-------------+------+-----+---------+-------+
  | Field | Type        | Null | Key | Default | Extra |
  +-------+-------------+------+-----+---------+-------+
  | c1    | int(11)     | NO   | PRI | NULL    |       |
  | c3    | varchar(32) | YES  |     | NULL    |       |
  +-------+-------------+------+-----+---------+-------+
  2 rows in set

  ```

#### 删除多列

删除多列的 SQL 语法如下：

```sql
ALTER TABLE table_name DROP COLUMN column_name1, DROP COLUMN column_name2, ...;

```

**示例如下：**

1. 创建测试表 `test_tbl5`。

   ```sql
   CREATE TABLE test_tbl5 (
     col1 NUMBER(38),
     col2 VARCHAR(50),
     col3 NUMBER(38),
     col4 NUMBER(38),
     col5 NUMBER(38),
     col6 NUMBER(38),
     col7 NUMBER(38),
     PRIMARY KEY(col1));

   ```
 2. 删除表 `test_tbl5` 的列 `col4` 和 `col5`。

   ```sql
   ALTER TABLE test_tbl5 DROP COLUMN col4, DROP COLUMN col5;

   ```
 3. 查看表 `test_tbl5` 的结构。

   ```sql
   DESC test_tbl5;

   ```

   返回结果如下：

   ```shell
   +-------+--------------+------+------+---------+-------+
   | FIELD | TYPE         | NULL | KEY  | DEFAULT | EXTRA |
   +-------+--------------+------+------+---------+-------+
   | COL1  | NUMBER(38)   | NO   | PRI  | NULL    | NULL  |
   | COL2  | VARCHAR(50) | YES  | NULL | NULL    | NULL  |
   | COL3  | NUMBER(38)   | YES  | NULL | NULL    | NULL  |
   | COL6  | NUMBER(38)   | YES  | NULL | NULL    | NULL  |
   | COL7  | NUMBER(38)   | YES  | NULL | NULL    | NULL  |
   +-------+--------------+------+------+---------+-------+
   3 rows in set

   ```

### 清除废弃列

当某些列被删除，即使这些列不再被使用，它们仍然占据物理存储空间。如果要移除这些废弃列并回收相关空间，需要清除废弃列。

清除废弃列的 SQL 语法如下：

```sql
ALTER TABLE table_name FORCE;

```

**示例如下：**

```sql
ALTER TABLE test_tbl5 FORCE;

```

## 修改索引

OceanBase 数据库支持增加唯一索引、普通索引和全文索引，同时还支持修改索引的属性。

- 增加唯一索引

  OceanBase 数据库支持在创建表后为表增加唯一索引。如果创建表时同时设置了主键，OceanBase 数据库会默认为主键列创建一个唯一索引。

  为表增加唯一索引的示例如下：

     1. 创建表 `test`。

       ```sql
       obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));

       ```
     2. 为表增加唯一索引。

       ```sql
       obclient> ALTER TABLE test ADD UNIQUE INDEX index_name(c2);

       ```
 - 增加普通索引

  OceanBase 数据库支持一次增加多个索引，索引关键字用 `INDEX` 或 `KEY` 均可以。

  为表增加普通索引的示例如下：

       ```
     2. 同时为表的 `c1`、`c2` 列添加名为 `myidx` 的索引。

       ```sql
       obclient> ALTER TABLE test ADD INDEX myidx(c1,c2);

       ```
 - 增加全文索引

  OceanBase 数据库支持为已有的表添加全文索引。

  示例如下：

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

       ```
     2. 为表 `test` 添加全文索引 `ft_idx1_test`，指定全文索引的分词器为 `BENG`。

       ```sql
       ALTER TABLE test ADD FULLTEXT INDEX ft_idx1_test(col2) WITH PARSER BENG;

       ```
 - 删除索引

  OceanBase 数据库支持删除索引，删除多个索引时用逗号隔开，索引关键字用 `INDEX` 或 `KEY` 均可以。示例如下：

  ```sql
  obclient> ALTER TABLE test DROP KEY index_name, DROP KEY index_name1;

  ```

## 更改表的主键、外键及 Check 约束

OceanBase 数据库支持更改表的主键、外键及 Check 约束，具体操作及详细说明请参见 [定义列的约束类型](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476738)。

## 更改表的副本数

设置表的副本数为 `2`。示例如下：

```sql
obclient> ALTER TABLE test SET REPLICA_NUM=2;

```

## 重命名表

表创建成功后，您可以更改表名。OceanBase 数据库支持重命名表。

示例如下：

```sql
obclient> ALTER TABLE test RENAME TO t1;

```

或者也可以使用以下语句：

```sql
obclient> RENAME TABLE test TO t1;

```

## 表行存列存转换

OceanBase 数据库默认建表时，构建的是行存表，通过设置 `WITH COLUMN GROUP` 选项可以显式指定为列存或者行存列存冗余状态。

表创建成功后，您可以使用 `ALTER TABLE` 语句对表进行行存列存转换，语法格式如下：

- 将表变更为列存表：

  ```sql
  ALTER TABLE table_name ADD COLUMN GROUP([all columns,] each column) [DELAYED];

  ```
 - 移除表的存储格式：

  ```sql
  ALTER TABLE table_name DROP COLUMN GROUP([all columns,] each column);

  ```

**参数解释：**

- `table_name`：指定表名称。
 - `ADD COLUMN GROUP(all columns, each column)`：表示将表变更为行存列存冗余格式的表。
 - `ADD COLUMN GROUP(each column)`：表示将表变更为列存格式的表。
 - `DELAYED`：可选项，表示延迟（异步）执行行存表转列存表命令，命令执行后表定义中的存储格式已做修改，但是真正执行行存转列存操作的时机是执行合并任务时，此操作不阻塞当前 DML，为 Online DDL。如果没有指定 `DELAYED`，默认为 Offline DDL ，将同步操作行存表转为列存表。

  #### 注意

     - 当前仅支持将行存表修改为列存表（`each column`）和将行存表修改为行存列存冗余格式的表（`all columns, each column`）时指定 `DELAYED`。
     - 在执行 `DELAYED` 延迟操作行存表转列存表命令后，在基线数据实际完成合并前，由于数据存储格式没有真正的转换，查询性能可能不符合预期。
 - `DROP COLUMN GROUP(all columns, each column)`：表示移除表的行存列存冗余格式。
 - `DROP COLUMN GROUP(all columns)`：表示移除表的行存格式。
 - `DROP COLUMN GROUP(each column)`：表示移除表的列存格式。

### 行存表转换为列存表

#### 说明

将通过设置 `WITH COLUMN GROUP(all columns)` 选项创建的行存表转换为列存表时，再设置 `ADD COLUMN GROUP(each column)` 后，还要执行 `DROP COLUMN GROUP(all columns)` 命令来删除这个列组。

**示例如下：**

- 默认创建行存表。

     1. 创建行存表 `tbl1`。

       ```sql
       CREATE TABLE tbl1(col1 INT, col2 VARCHAR(30), col3 DATE);

       ```
     2. 将行存表 `tbl1` 换为列存表。

            - Offline DDL 修改如下：

             ```sql
             ALTER TABLE tbl1 ADD COLUMN GROUP(each column);

             ```
            - Online DDL（异步将行存表转换为列存表）修改如下：

             ```sql
             ALTER TABLE tbl1 ADD COLUMN GROUP(each column) DELAYED;

             ```
 - 通过设置 `WITH COLUMN GROUP(all columns)` 选项创建的行存表。

       ```sql
       CREATE TABLE tbl1_ac(col1 INT, col2 VARCHAR(30), col3 DATE) WITH COLUMN GROUP(all columns);

             ```sql
             ALTER TABLE tbl1_ac ADD COLUMN GROUP(each column);

             ```sql
             ALTER TABLE tbl1_ac ADD COLUMN GROUP(each column) DELAYED;

             ```
     3. 通过设置 `DROP COLUMN GROUP(all columns)` 来删除行存格式。

       ```sql
       ALTER TABLE tbl1_ac DROP COLUMN GROUP(all columns);

       ```

### 行存表转换为行存列存冗余表

**示例如下：**

1. 创建行存表 `tbl2`。

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

   ```
 2. 将行存表 `tbl2` 转换为行存列存冗余表。

       ```sql
       ALTER TABLE tbl2 ADD COLUMN GROUP(all columns, each column);

       ```
      - Online DDL（异步将行存表转换为行存列存冗余表）修改如下：

       ```sql
       ALTER TABLE tbl2 ADD COLUMN GROUP(all columns, each column) DELAYED;

       ```

### 行存列存冗余表转换为列存表

**示例如下：**

1. 创建行存列存冗余表 `tbl3`。

   ```sql
   CREATE TABLE tbl3(col1 INT, col2 VARCHAR(30), col3 DATE) WITH COLUMN GROUP(all columns, each column);

   ```
 2. 将行存列存冗余表 `tbl3` 转换为列存表。

   ```sql
   ALTER TABLE tbl3 DROP COLUMN GROUP(all columns);

   ```

### 行存列存冗余表转换为行存表

**示例如下：**

1. 创建行存列存冗余表 `tbl4`。

   ```sql
   CREATE TABLE tbl4(col1 INT, col2 VARCHAR(30), col3 DATE) WITH COLUMN GROUP(all columns, each column);

   ```
 2. 将行存列存冗余表 `tbl4` 转换为行存表。

   ```sql
   ALTER TABLE tbl4 DROP COLUMN GROUP(each column);

   ```

   或者

   ```sql
   ALTER TABLE tbl4 DROP COLUMN GROUP(all columns, each column);

   ```

## 相关文档

更多 `ALTER TABLE` 语句的介绍，请参见 [ALTER TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479592)。

 上一篇 下一篇 ![有帮助](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) 咨询热线
