首批通过分布式安全可靠测评,为关键业务系统打造
更改表
更新时间:2026-06-13 09:08:53
表创建成功后,您可以使用 ALTER TABLE 语句对表进行修改。
注意事项
在执行更改表的主键或列类型的操作时,禁止执行其他的 DDL 操作。同时,在执行其他的 DDL 操作时,禁止执行更改表的主键或列类型的操作。
增加、修改、删除列和清除废弃列
OceanBase 数据库支持新增列、修改列及其属性、删除列、清除废弃列等。
新增列
OceanBase 数据库支持在表中新增列,但不支持直接增加主键列。如果需要增加主键列,建议先增加列后再为列添加主键。添加主键的相关操作请参见 定义列的约束类型。
新增列的 SQL 语法如下:
ALTER TABLE table_name ADD column_definition;
示例如下:
创建测试表
test_tbl1。CREATE TABLE test_tbl1 ( col1 NUMBER(38), col2 VARCHAR2(50), PRIMARY KEY(col1));向表
test_tbl1中增加列col3。ALTER TABLE test_tbl1 ADD col3 NUMBER(38);查看表
test_tbl1的结构。DESCRIBE test_tbl1;返回结果如下:
+-------+--------------+------+------+---------+-------+ | 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 数据库中列类型的转换规则及详细信息请参见 列类型变更规则。
修改列类型的 SQL 语法如下:
ALTER TABLE table_name MODIFY [COLUMN] column_definition;
示例如下:
创建测试表
test_tbl2。CREATE TABLE test_tbl2 ( col1 NUMBER(38), col2 VARCHAR2(20));查看表
test_tbl2的结构。DESCRIBE test_tbl2;返回结果如下:
+-------+--------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+------+---------+-------+ | COL1 | NUMBER(38) | YES | NULL | NULL | NULL | | COL2 | VARCHAR2(20) | YES | NULL | NULL | NULL | +-------+--------------+------+------+---------+-------+ 2 rows in set修改表
test_tbl2列col2的类型为CHAR(50)。ALTER TABLE test_tbl2 MODIFY col2 CHAR(50);修改表
test_tbl2列col1的默认值为 0。ALTER TABLE test_tbl2 MODIFY col1 DEFAULT 0;修改表
test_tbl2列col2的值为非空。ALTER TABLE test_tbl2 MODIFY col2 NOT NULL;查看表
test_tbl2的结构。DESCRIBE test_tbl2;返回结果如下:
+-------+------------+------+------+---------+-------+ | 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 语法如下:
ALTER TABLE table_name RENAME COLUMN old_col_name TO new_col_name;
示例如下:
创建测试表
test_tbl3。CREATE TABLE test_tbl3 ( col1 NUMBER(38), col2 VARCHAR2(20), PRIMARY KEY(col1));修改表
test_tbl3列col1的名称为col1_new。ALTER TABLE test_tbl3 RENAME COLUMN col1 TO col1_new;查看表
test_tbl3的结构。DESCRIBE test_tbl3;返回结果如下:
+----------+--------------+------+------+---------+-------+ | 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 语法如下:
ALTER TABLE table_name DROP COLUMN column_name;
示例如下:
创建测试表
test_tbl4。CREATE TABLE test_tbl4 ( col1 NUMBER(38), col2 VARCHAR2(50), PRIMARY KEY(col1));删除表
test_tbl4的列col2。ALTER TABLE test_tbl4 DROP COLUMN col2;查看表
test_tbl4的结构。DESCRIBE test_tbl4;返回结果如下:
+-------+------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+------+---------+-------+ | COL1 | NUMBER(38) | NO | PRI | NULL | NULL | +-------+------------+------+------+---------+-------+ 1 row in set
删除多列
删除多列的 SQL 语法如下:
ALTER TABLE table_name DROP (column_name1, column_name1, ...);
或
ALTER TABLE table_name DROP COLUMN column_name1, DROP COLUMN column_name2, ...;
示例如下:
创建测试表
test_tbl5。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));删除表
test_tbl5的列col6和col7。ALTER TABLE test_tbl5 DROP (col6, col7);删除表
test_tbl5的列col4和col5。ALTER TABLE test_tbl5 DROP COLUMN col4, DROP COLUMN col5;查看表
test_tbl5的结构。DESCRIBE test_tbl5;返回结果如下:
+-------+--------------+------+------+---------+-------+ | 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
清除废弃列
当某些列被删除,即使这些列不再被使用,它们仍然占据物理存储空间。如果要移除这些废弃列并回收相关空间,需要清除废弃列。
清除废弃列的 SQL 语法如下:
ALTER TABLE table_name FORCE;
示例如下:
ALTER TABLE test_tbl5 FORCE;
增加唯一约束
OceanBase 数据库支持为已存在的表增加唯一约束。
增加唯一约束的 SQL 语法如下:
ALTER TABLE table_name ADD [CONSTRAINT [constraint_name]] UNIQUE (column_name [, column_name ]...);
示例如下:
创建测试表
test_tbl6。CREATE TABLE test_tbl6 ( col1 NUMBER(38), col2 VARCHAR2(50), PRIMARY KEY(col1));在表
test_tbl6的列col2上添加唯一性约束。ALTER TABLE test_tbl6 ADD UNIQUE(col2);查看表
test_tbl6的结构。DESCRIBE test_tbl6;返回结果如下:
+-------+--------------+------+------+---------+-------+ | 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 语法如下:
ALTER TABLE old_table_name RENAME TO new_table_name;
或
RENAME old_table_name TO new_table_name;
示例如下:
ALTER TABLE test RENAME TO t1;
或
RENAME test TO t1;
更改表的主键和外键
创建表后,OceanBase 数据库支持添加或删除表的主键和外键,更改表的主键和外键的具体操作及说明请参见 定义列的约束类型。
修改列的 Skip Index 属性
OceanBase 数据库支持使用 ALTER TABLE 语句添加、修改和删除 Skip Index 属性。
更多有关 Skip Index 的信息,请参见 列 Skip Index 属性。
示例如下:
使用下面 SQL 语句创建表
test_skidx。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) );修改表
test_skidx中列col2的 Skip Index 属性为SUMSkip Index 类型。ALTER TABLE test_skidx MODIFY col2 FLOAT SKIP_INDEX(SUM);建表后新增列的 Skip Index 属性。为表
test_skidx中列col4增加的MIN_MAXSkip Index 类型。ALTER TABLE test_skidx MODIFY col4 CHAR(10) SKIP_INDEX(MIN_MAX);建表后删除列的 Skip Index 属性。删除表
test_skidx中列col1的 Skip Index 属性。ALTER TABLE test_skidx MODIFY col1 NUMBER SKIP_INDEX();
表行存列存转换
OceanBase 数据库默认建表时,构建的是行存表,通过设置 WITH COLUMN GROUP 选项可以显式指定为列存或者行存列存冗余状态。
表创建成功后,您可以使用 ALTER TABLE 语句对表进行行存列存转换,语法格式如下:
将表变更为列存表:
ALTER TABLE table_name ADD COLUMN GROUP([all columns,] each column) [DELAYED];移除表的存储格式:
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) 命令来删除这个列组。
示例如下:
默认创建行存表。
创建行存表
tbl1。CREATE TABLE tbl1(col1 NUMBER, col2 VARCHAR2(30));将行存表
tbl1换为列存表。Offline DDL 修改如下:
ALTER TABLE tbl1 ADD COLUMN GROUP(each column);Online DDL(异步将行存表转换为列存表)修改如下:
ALTER TABLE tbl1 ADD COLUMN GROUP(each column) DELAYED;
通过设置
WITH COLUMN GROUP(all columns)选项创建的行存表。创建行存表
tbl1。CREATE TABLE tbl1_ac(col1 NUMBER, col2 VARCHAR2(30)) WITH COLUMN GROUP(all columns);将行存表
tbl1换为列存表。Offline DDL 修改如下:
ALTER TABLE tbl1_ac ADD COLUMN GROUP(each column);Online DDL(异步将行存表转换为列存表)修改如下:
ALTER TABLE tbl1_ac ADD COLUMN GROUP(each column) DELAYED;
通过设置
DROP COLUMN GROUP(all columns)来删除行存格式。ALTER TABLE tbl1_ac DROP COLUMN GROUP(all columns);
行存表转换为行存列存冗余表
示例如下:
创建行存表
tbl2。CREATE TABLE tbl2(col1 NUMBER, col2 VARCHAR2(30));将行存表
tbl2转换为行存列存冗余表。Offline DDL 修改如下:
ALTER TABLE tbl2 ADD COLUMN GROUP(all columns, each column);Online DDL(异步将行存表转换为行存列存冗余表)修改如下:
ALTER TABLE tbl2 ADD COLUMN GROUP(all columns, each column) DELAYED;
行存列存冗余表转换为列存表
示例如下:
创建行存列存冗余表
tbl3。CREATE TABLE tbl3(col1 NUMBER, col2 VARCHAR2(30)) WITH COLUMN GROUP(all columns, each column);将行存列存冗余表
tbl3转换为列存表。ALTER TABLE tbl3 DROP COLUMN GROUP(all columns);
行存列存冗余表转换为行存表
示例如下:
创建行存列存冗余表
tbl4。CREATE TABLE tbl4(col1 NUMBER, col2 VARCHAR2(30)) WITH COLUMN GROUP(all columns, each column);将行存列存冗余表
tbl4转换为行存表。ALTER TABLE tbl4 DROP COLUMN GROUP(each column);或者
ALTER TABLE tbl4 DROP COLUMN GROUP(all columns, each column);
相关文档
更多 ALTER TABLE 语句的介绍,请参见 ALTER TABLE。