首批通过分布式安全可靠测评,为关键业务系统打造
更改表
更新时间:2026-04-10 11:58:01
表创建成功后,您可以使用 ALTER TABLE 语句对表进行修改。
注意事项
在执行更改表的主键或列类型的操作时,禁止执行其他的 DDL 操作。同时,在执行其他的 DDL 操作时,禁止执行更改表的主键或列类型的操作。
增加、修改和删除列
OceanBase 数据库支持新增列、修改列及其属性、删除列等。
新增列,支持在表中新增列,但不支持直接增加主键列。如果需要增加主键列,建议先增加列后再为列添加主键。添加主键的相关操作请参见 定义列的约束类型。
新增普通列的示例如下:
obclient> DESCRIBE test; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C1 | NUMBER(38) | NO | PRI | NULL | NULL | | C2 | VARCHAR2(50) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 2 rows in set obclient> ALTER TABLE test ADD c3 int; Query OK, 0 rows affected obclient> DESCRIBE test; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C1 | NUMBER(38) | NO | PRI | NULL | NULL | | C2 | VARCHAR2(50) | YES | NULL | NULL | NULL | | C3 | NUMBER(38) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 3 rows in set修改列类型。OceanBase 数据库支持多种列类型之间的转换。
OceanBase 数据库中列类型的转换规则及详细信息请参见 列类型变更规则。
修改列类型的 SQL 语法如下:
ALTER TABLE table_name MODIFY (column_name data_type);示例如下:
obclient> DESCRIBE test; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C1 | NUMBER(38) | NO | PRI | NULL | NULL | | C2 | VARCHAR2(50) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 2 rows in set obclient> ALTER TABLE test MODIFY (c2 VARCHAR(70)); Query OK, 0 rows affected obclient> DESCRIBE test; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C1 | NUMBER(38) | YES | NULL | NULL | NULL | | C2 | VARCHAR2(70) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 2 rows in set修改列名。示例如下:
obclient> ALTER TABLE test RENAME COLUMN c1 TO c; Query OK, 0 rows affected obclient> DESCRIBE test; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C | NUMBER(38) | YES | NULL | NULL | NULL | | C2 | VARCHAR2(70) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 2 rows in set修改列的默认值。示例如下:
obclient> ALTER TABLE test MODIFY c DEFAULT 1; Query OK, 0 rows affected obclient> DESCRIBE test; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C | NUMBER(38) | YES | NULL | 1 | NULL | | C2 | VARCHAR2(70) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 2 rows in set修改列的非空约束。示例如下:
obclient> DESCRIBE test; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C | NUMBER(38) | YES | NULL | 1 | NULL | | C2 | VARCHAR2(70) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 2 rows in set obclient> ALTER TABLE test MODIFY (c2 NOT NULL); Query OK, 0 rows affected obclient> DESCRIBE test; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C | NUMBER(38) | YES | NULL | 1 | NULL | | C2 | VARCHAR2(70) | NO | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 2 rows in set删除列,支持删除表中的列,但不允许删除主键列或包含索引的列。示例如下:
obclient> DESCRIBE test; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C1 | NUMBER(38) | NO | PRI | NULL | NULL | | C2 | VARCHAR2(50) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 2 rows in set obclient> ALTER TABLE test DROP COLUMN c2; Query OK, 0 rows affected obclient> DESCRIBE test; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C1 | NUMBER(38) | NO | PRI | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 1 rows in set
修改索引
OceanBase 数据库支持为已存在的表增加唯一索引。示例如下:
obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));
Query OK, 0 rows affected
obclient> ALTER TABLE test ADD UNIQUE(c2);
重命名表
表创建成功后,您可以更改表名。
OceanBase 数据库支持重命名表。示例如下:
obclient> ALTER TABLE test RENAME TO t1;
或
obclient> RENAME test TO t1;
更改表的主键和外键
创建表后,OceanBase 数据库支持添加或删除表的主键和外键,更改表的主键和外键的具体操作及说明请参见 定义列的约束类型。
更改表的副本数
创建表后,还支持更改表的副本数。
设置表的副本数为 2 的示例如下:
obclient> ALTER TABLE test SET REPLICA_NUM=2;
Query OK, 0 rows affected
修改列的 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 语句对表进行行存列存转换。
行存表转换为列存表
示例如下:
创建行存表
tbl1。obclient> CREATE TABLE tbl1(col1 NUMBER, col2 VARCHAR2(30));将行存表
tbl1换为列存表。obclient> ALTER TABLE tbl1 ADD COLUMN GROUP(each column);
行存表转换为行存列存冗余表
示例如下:
创建行存表
tbl2。obclient> CREATE TABLE tbl2(col1 NUMBER, col2 VARCHAR2(30));将行存表
tbl2转换为行存列存冗余表。obclient> ALTER TABLE tbl2 ADD COLUMN GROUP(all columns, each column);
行存列存冗余表转换为列存表
示例如下:
创建行存列存冗余表
tbl3。obclient> CREATE TABLE tbl3(col1 NUMBER, col2 VARCHAR2(30)) WITH COLUMN GROUP(all columns, each column);将行存列存冗余表
tbl3转换为列存表。obclient> ALTER TABLE tbl3 DROP COLUMN GROUP(all columns);
行存列存冗余表转换为行存表
示例如下:
创建行存列存冗余表
tbl4。obclient> CREATE TABLE tbl4(col1 NUMBER, col2 VARCHAR2(30)) WITH COLUMN GROUP(all columns, each column);将行存列存冗余表
tbl4转换为行存表。obclient> ALTER TABLE tbl4 DROP COLUMN GROUP(each column);或者
obclient> ALTER TABLE tbl4 DROP COLUMN GROUP(all columns, each column);
相关文档
更多 ALTER TABLE 语句的介绍,请参见 ALTER TABLE。