首批通过分布式安全可靠测评,为关键业务系统打造
更改表
更新时间:2026-07-15 20:56:58
表创建成功后,您可以使用 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删除多列,支持删除表中的多列,但不允许删除主键列。您可以使用
ALTER TABLE TABLE_NAME DROP (COLUMN_NAME1, COLUMN_NAME2, ...);或ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME1, DROP COLUMN COLUMN_NAME2, ...;两种方式删除多列。示例如下:obclient> DESCRIBE tbl2; +-------+--------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+------+---------+-------+ | COL1 | NUMBER(30) | NO | PRI | NULL | NULL | | COL2 | VARCHAR2(50) | YES | NULL | NULL | NULL | | COL3 | NUMBER(30) | YES | NULL | NULL | NULL | | COL4 | NUMBER(30) | YES | NULL | NULL | NULL | | COL5 | NUMBER(30) | YES | NULL | NULL | NULL | +-------+--------------+------+------+---------+-------+ 5 rows in set obclient> ALTER TABLE tbl2 DROP (col4, col5); Query OK, 0 rows affected obclient> DESCRIBE tbl2; +-------+--------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+------+---------+-------+ | COL1 | NUMBER(30) | NO | PRI | NULL | NULL | | COL2 | VARCHAR2(50) | YES | NULL | NULL | NULL | | COL3 | NUMBER(30) | YES | NULL | NULL | NULL | +-------+--------------+------+------+---------+-------+ 3 rows in set obclient> ALTER TABLE tbl2 DROP COLUMN col2, DROP COLUMN col3; Query OK, 0 rows affected obclient> DESCRIBE tbl2; +-------+------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+------+---------+-------+ | COL1 | NUMBER(30) | NO | PRI | NULL | NULL | +-------+------------+------+------+---------+-------+ 1 row in set清除废弃列。当某些列被删除,即使这些列不再被使用,它们仍然占据物理存储空间。如果您需要移除这些废弃列并回收相关空间,需要执行命令
ALTER TABLE TABLE_NAME FORCE;以清除废弃列。obclient> ALTER TABLE tbl2 FORCE; Query OK, 0 rows affected
修改索引
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