---
title: "更改表 - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: 更改表 表创建成功后，您可以使用 ALTER TABLE 语句对表进行修改。 注意事项 在执行更改表的主键或列类型的操作时，禁止执行其他的 DDL 操作。同时，在执行其他的 DDL 操作时，禁止执行更改表的主键或列类型的操作。 增加、修改、删除列和清除废弃列 OceanBase 数据库支持新增列、修改列及其属性、删除…
---
切换语言

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

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

# 更改表

更新时间：2026-06-13 09:08:53

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

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

## 注意事项

在执行更改表的主键或列类型的操作时，禁止执行其他的 DDL 操作。同时，在执行其他的 DDL 操作时，禁止执行更改表的主键或列类型的操作。

## 增加、修改、删除列和清除废弃列

OceanBase 数据库支持新增列、修改列及其属性、删除列、清除废弃列等。

### 新增列

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

新增列的 SQL 语法如下：

```sql
ALTER TABLE table_name ADD column_definition;

```

**示例如下：**

1. 创建测试表 `test_tbl1`。

   ```sql
   CREATE TABLE test_tbl1 (
     col1 NUMBER(38),
     col2 VARCHAR2(50),
     PRIMARY KEY(col1));

   ```
 2. 向表 `test_tbl1` 中增加列 `col3`。

   ```sql
   ALTER TABLE test_tbl1 ADD col3 NUMBER(38);

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

   ```sql
   DESCRIBE test_tbl1;

   ```

   返回结果如下：

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

   ```

### 修改列

#### 修改列属性

OceanBase 数据库支持多种列类型之间的转换、默认值和非空约束等。OceanBase 数据库中列类型的转换规则及详细信息请参见 [列类型变更规则](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005686346)。

修改列类型的 SQL 语法如下：

```sql
ALTER TABLE table_name MODIFY [COLUMN] column_definition;

```

**示例如下：**

1. 创建测试表 `test_tbl2`。

   ```sql
   CREATE TABLE test_tbl2 (
     col1 NUMBER(38),
     col2 VARCHAR2(20));

   ```
 2. 查看表 `test_tbl2` 的结构。

   ```sql
   DESCRIBE test_tbl2;

   ```

   返回结果如下：

   ```shell
   +-------+--------------+------+------+---------+-------+
   | FIELD | TYPE         | NULL | KEY  | DEFAULT | EXTRA |
   +-------+--------------+------+------+---------+-------+
   | COL1  | NUMBER(38)   | YES  | NULL | NULL    | NULL  |
   | COL2  | VARCHAR2(20) | YES  | NULL | NULL    | NULL  |
   +-------+--------------+------+------+---------+-------+
   2 rows in set

   ```
 3. 修改表 `test_tbl2` 列 `col2` 的类型为 `CHAR(50)`。

   ```sql
   ALTER TABLE test_tbl2 MODIFY col2 CHAR(50);

   ```
 4. 修改表 `test_tbl2` 列 `col1` 的默认值为 0。

   ```sql
   ALTER TABLE test_tbl2 MODIFY col1 DEFAULT 0;

   ```
 5. 修改表 `test_tbl2` 列 `col2` 的值为非空。

   ```sql
   ALTER TABLE test_tbl2 MODIFY col2 NOT NULL;

   ```
 6. 查看表 `test_tbl2` 的结构。

   ```

   返回结果如下：

   ```shell
   +-------+------------+------+------+---------+-------+
   | FIELD | TYPE       | NULL | KEY  | DEFAULT | EXTRA |
   +-------+------------+------+------+---------+-------+
   | COL1  | NUMBER(38) | YES  | NULL | 0       | NULL  |
   | COL2  | CHAR(50)   | NO   | NULL | NULL    | NULL  |
   +-------+------------+------+------+---------+-------+
   2 rows in set

   ```

#### 修改列名称

修改列名称的 SQL 语法如下：

```sql
ALTER TABLE table_name RENAME COLUMN old_col_name TO new_col_name;

```

**示例如下：**

1. 创建测试表 `test_tbl3`。

   ```sql
   CREATE TABLE test_tbl3 (
     col1 NUMBER(38),
     col2 VARCHAR2(20),
     PRIMARY KEY(col1));

   ```
 2. 修改表 `test_tbl3` 列 `col1` 的名称为 `col1_new`。

   ```sql
   ALTER TABLE test_tbl3 RENAME COLUMN col1 TO col1_new;

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

   ```sql
   DESCRIBE test_tbl3;

   ```

   返回结果如下：

   ```shell
   +----------+--------------+------+------+---------+-------+
   | FIELD    | TYPE         | NULL | KEY  | DEFAULT | EXTRA |
   +----------+--------------+------+------+---------+-------+
   | COL1_NEW | NUMBER(38)   | NO   | PRI  | NULL    | NULL  |
   | COL2     | VARCHAR2(20) | YES  | NULL | NULL    | NULL  |
   +----------+--------------+------+------+---------+-------+
   2 rows in set

   ```

### 删除列

删除列，支持删除表中的列，但不允许删除主键列。

#### 删除单列

删除单列的 SQL 语法如下：

```sql
ALTER TABLE table_name DROP COLUMN column_name;

```

**示例如下：**

1. 创建测试表 `test_tbl4`。

   ```sql
   CREATE TABLE test_tbl4 (
     col1 NUMBER(38),
     col2 VARCHAR2(50),
     PRIMARY KEY(col1));

   ```
 2. 删除表 `test_tbl4` 的列 `col2`。

   ```sql
   ALTER TABLE test_tbl4 DROP COLUMN col2;

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

   ```sql
   DESCRIBE test_tbl4;

   ```

   返回结果如下：

   ```shell
   +-------+------------+------+------+---------+-------+
   | FIELD | TYPE       | NULL | KEY  | DEFAULT | EXTRA |
   +-------+------------+------+------+---------+-------+
   | COL1  | NUMBER(38) | NO   | PRI  | NULL    | NULL  |
   +-------+------------+------+------+---------+-------+
   1 row in set

   ```

#### 删除多列

删除多列的 SQL 语法如下：

```sql
ALTER TABLE table_name DROP (column_name1, column_name1, ...);

```

或

```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 VARCHAR2(50),
     col3 NUMBER(38),
     col4 NUMBER(38),
     col5 NUMBER(38),
     col6 NUMBER(38),
     col7 NUMBER(38),
     PRIMARY KEY(col1));

   ```
 2. 删除表 `test_tbl5` 的列 `col6` 和 `col7`。

   ```sql
   ALTER TABLE test_tbl5 DROP (col6, col7);

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

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

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

   ```sql
   DESCRIBE test_tbl5;

   ```

   返回结果如下：

   ```

### 清除废弃列

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

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

```sql
ALTER TABLE table_name FORCE;

```

**示例如下：**

```sql
ALTER TABLE test_tbl5 FORCE;

```

## 增加唯一约束

OceanBase 数据库支持为已存在的表增加唯一约束。

增加唯一约束的 SQL 语法如下：

```sql
ALTER TABLE table_name ADD [CONSTRAINT [constraint_name]] UNIQUE (column_name [, column_name ]...);

```

**示例如下：**

1. 创建测试表 `test_tbl6`。

   ```sql
   CREATE TABLE test_tbl6 (
     col1 NUMBER(38),
     col2 VARCHAR2(50),
     PRIMARY KEY(col1));

   ```
 2. 在表 `test_tbl6` 的列 `col2` 上添加唯一性约束。

   ```sql
   ALTER TABLE test_tbl6 ADD UNIQUE(col2);

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

   ```sql
   DESCRIBE test_tbl6;

   ```

   返回结果如下：

   ```shell
   +-------+--------------+------+------+---------+-------+
   | FIELD | TYPE         | NULL | KEY  | DEFAULT | EXTRA |
   +-------+--------------+------+------+---------+-------+
   | COL1  | NUMBER(38)   | NO   | PRI  | NULL    | NULL  |
   | COL2  | VARCHAR2(50) | YES  | UNI  | NULL    | NULL  |
   +-------+--------------+------+------+---------+-------+
   2 rows in set

   ```

## 重命名表

表创建成功后，您可以更改表名。

重命名表的 SQL 语法如下：

```sql
ALTER TABLE old_table_name RENAME TO new_table_name;

```

或

```sql
RENAME old_table_name TO new_table_name;

```

**示例如下：**

```sql
ALTER TABLE test RENAME TO t1;

```

或

```sql
RENAME test TO t1;

```

## 更改表的主键和外键

创建表后，OceanBase 数据库支持添加或删除表的主键和外键，更改表的主键和外键的具体操作及说明请参见 [定义列的约束类型](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005683120)。

## 修改列的 Skip Index 属性

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

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

**示例如下：**

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

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

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

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

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

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

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

   ```sql
   ALTER TABLE test_skidx MODIFY col1 NUMBER SKIP_INDEX();

   ```

## 表行存列存转换

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 NUMBER, col2 VARCHAR2(30));

       ```
     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 NUMBER, col2 VARCHAR2(30)) 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 NUMBER, col2 VARCHAR2(30));

   ```
 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 NUMBER, col2 VARCHAR2(30)) 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 NUMBER, col2 VARCHAR2(30)) 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-1000000005687569)。

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