首批通过分布式安全可靠测评,为关键业务系统打造
列操作
更新时间:2026-07-15 22:01:30
OceanBase 数据库 Oracle 模式下的列操作包括尾部添加列、删除列、重命名列、修改列类型、管理列默认值、管理约束、设置自增列值。
尾部添加列
尾部添加列的语法如下:
ALTER TABLE table_name ADD column_name column_definition;
相关参数说明如下:
table_name:指定待添加列的表的表名。column_name:指定待添加列的列名。column_definition:指定待添加列的数据类型及约束信息。
详细介绍可参见 ALTER TABLE
假设数据库中存在表 tbl1,tbl1 表结构信息如下所示:
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
此处以在 tbl1 表的表尾添加 C4 列为例,介绍如何为表添加列。
obclient> ALTER TABLE tbl1 ADD C4 INT;
再次执行 DESCRIBE tbl1; 命令查看 tbl1 表的表结构,输出如下,表 tbl1 中已新增 C4 列。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
| C4 | NUMBER(38) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
删除列
DROP COLUMN 是 Online DDL 操作,实现为标记删除,不会触发数据重整,即被删除列占用的磁盘空间并不会被回收,且被删除列还存在 Schema 中,只是通过标记的方式将对应列废弃掉。要彻底清除废弃列及其在 Schema 中的数据和信息,请执行 ALTER TABLE TABLE_NAME FORCE; 命令。
删除列注意事项
在进行删除列操作时,需要注意以下事项:
OceanBase 数据库为了保持内部参照的完整性和避免潜在的名称冲突,会将修改废弃列的列名修改为:
SYS_C[COLUMN_ID]_TIME$。那么,新增列的名称不能与已废弃列的系统生成名称相同,即避免使用SYS_C[COLUMN_ID]_TIME$格式的名称,以确保名称的唯一性和避免潜在冲突。更多关于查看列命名的信息,参见 ALL_TAB_COLSOceanBase 数据库限制了表中可以存在的废弃列的数量上限。当废弃列的数量超过 128 列时,将不能进行增加列或删除列的操作,用户需执行
ALTER TABLE TABLE_NAME FORCE;来清理这些废弃列。删除列的 DDL 操作与其他操作结合时,数据库将会进行物理删除,确保列完全从表结构和存储中移除。
在 OceanBase 数据库中,单个数据行的最大长度限制为 1.5MB。若在达到此长度上限的表中,表尾部的某些列被标记为废弃,即使这些列不再被使用,它们仍然占据物理存储空间。如果用户计划在该表尾部进一步添加新列,必须首先执行命令
ALTER TABLE TABLE_NAME FORCE;以移除这些废弃列并回收相关空间,之后方可进行列的添加操作。以下 Offline DDL 操作在触发数据重整的同时会清除废弃列及其在 Schema 中的数据和信息,与执行
ALTER TABLE TABLE_NAME FORCE;命令效果相同:- 添加/删除修改主键
- 混合列操作
- 修改分区规则
- 添加自增列
TRUNCATE表
更多关于 Online DDL 和 Offline DDL 操作,参见 Online DDL 和 Offline DDL 操作。
删除单列
删除单列的语法如下:
ALTER TABLE table_name DROP COLUMN column_name;
其中,table_name 指定待删除列所在表的表名;column_name 指定待删除列的列名。
假设数据库中存在表 tbl1,tbl1 表结构信息如下所示:
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
此处以删除 tbl1 表的中 C3 列为例,介绍如何删除表中的列。
obclient> ALTER TABLE tbl1 DROP COLUMN C3;
再次执行 DESCRIBE tbl1; 命令查看 tbl1 表的表结构,输出如下,表 tbl1 中已无 C3 列。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
删除多列
删除多列的语法有两种方式,如下所示:
--方式一
ALTER TABLE table_name DROP (column_name1, column_name2, ...);
--方式二
ALTER TABLE table_nameE DROP COLUMN column_name1, DROP COLUMN column_name2, ...;
与删除单列相同,table_name 指定待删除列所在表的表名;column_name 指定待删除列的列名。
假设数据库中存在表 tbl1,tbl1 表结构信息如下所示:
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(30) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
| C3 | NUMBER(30) | YES | NULL | NULL | NULL |
| C4 | NUMBER(30) | YES | NULL | NULL | NULL |
| C5 | NUMBER(30) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
此处以删除 tbl1 表的中 C4、C5 列为例,介绍如何使用 ALTER TABLE table_name DROP (column_name1, column_name2, ...) 删除表中的多列。
obclient> ALTER TABLE tbl1 DROP COLUMN (C4, C5);
再次执行 DESCRIBE tbl1; 命令查看 tbl1 表的表结构,输出如下,表 tbl1 中已无 C4、C5 列。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(30) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
| C3 | NUMBER(30) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
继续删除 tbl1 表的中 C2、C3 列为例,介绍如何使用 ALTER TABLE table_nameE DROP COLUMN column_name1, DROP COLUMN column_name2, ... 删除表中的多列。
obclient> ALTER TABLE tbl1 DROP COLUMN C2, DROP COLUMN C3;
再次执行 DESCRIBE tbl1; 命令查看 tbl1 表的表结构,输出如下,表 tbl1 中已无 C2、C3 列。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(30) | NO | PRI | NULL | NULL |
+-------+--------------+------+------+---------+-------+
清除废弃列
清除废弃列的语法,如下所示:
ALTER TABLE TABLE_NAME FORCE;
此处以清除 tbl1 表的中 C2、C3、C4、C5 列为例,介绍如何清除表中的废弃列。
obclient> ALTER TABLE tbl1 FORCE;
重命名列
重命名列的语法如下:
ALTER TABLE table_name RENAME COLUMN old_col_name TO new_col_name;
相关参数说明如下:
table_name:指定待重命名的列所在表的表名。old_col_name:指定待重命名的列的列名。new_col_name:指定重命名后列的列名。
假设数据库中存在表 tbl1,tbl1 表结构信息如下所示:
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
此处以修改 C3 列名为 C4 为例,介绍如何重命名表中的列名。
obclient> ALTER TABLE tbl1 RENAME COLUMN C3 TO C4;
再次执行 DESCRIBE tbl1; 命令查看 tbl1 表的表结构,输出如下,表 tbl1 中 C3 列已重命名为 C4。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C4 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
修改列类型
OceanBase 数据库所支持的列类型的相关转换如下:
字符类型列的数据类型转换,包括
CHAR和VARCHAR2。数值数据类型支持改变精度,包括
NUMBER(不允许降低精度)。字符数据类型支持改变精度,包括
CHAR(不允许降低精度)、VARCHAR2、NVARCHAR2和NCHAR。
OceanBase 数据库 Oracle 模式下相关的列类型变更规则,请参考 列类型变更规则。
修改列类型的语法如下:
ALTER TABLE table_name MODIFY column_name data_type;
相关参数说明如下:
table_name:指定待修改类型的列所在表的表名。column_name:指定待修改类型的列的列名。data_type:指定修改后的数据类型。
修改列类型的示例
字符数据类型之间的转换示例
如下所示,创建表 test01:
obclient> CREATE TABLE test01 (C1 INT PRIMARY KEY, C2 CHAR(10), C3 VARCHAR2(32));
以 test01 表为例,结合如下几条示例介绍如何修改字符数据类型列的数据类型以及长度。
修改 test01 表中
C2列长度为 20 字符obclient> ALTER TABLE test01 MODIFY C2 CHAR(20);修改 test01 表中
C2列数据类型为 VARCHAR,并指定长度最大为 20 字符obclient> ALTER TABLE test01 MODIFY C2 VARCHAR(20);修改 test01 表中
C3列长度最大为 64 字符obclient> ALTER TABLE test01 MODIFY C3 VARCHAR(64);修改 test01 表中
C3列长度最大为 16 字符obclient> ALTER TABLE test01 MODIFY C3 VARCHAR(16);修改 test01 表中
C3列数据类型为 CHAR,并指定长度为 256 字符obclient> ALTER TABLE test01 MODIFY C3 CHAR(256);
改变数值数据类型精度的示例
如下所示,创建表 test02:
obclient> CREATE TABLE test02(C1 NUMBER(10,2));
以 test02 表为例,介绍如何修改带精度的数值数据类型列的精度。
obclient> ALTER TABLE test02 MODIFY C1 NUMBER(11,3);
管理列的默认值
未设置的情况下,列的默认值为 NULL,管理列的默认值的语法如下:
ALTER TABLE table_name MODIFY column_name data_type DEFAULT const_value;
相关参数说明如下:
table_name:指定待修改默认值的列所在表的表名。column_name:指定待修改默认值的列的列名。data_type:指定待修改的列的数据类型,您可指定为当前数据类型,也可指定将该列修改为其他数据类型,支持修改的数据类型可参见上文 修改列类型。const_value:指定修改后列的默认值。
假设数据库中存在表 tbl1,tbl1 表结构信息如下所示:
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | 333 | NULL |
+-------+--------------+------+------+---------+-------+
您可执行如下命令设置列的默认值,此处修改
C1列的默认值为 111obclient> ALTER TABLE tbl1 MODIFY C1 NUMBER(10) DEFAULT 111;您可执行如下命令删除列的默认值,此处删去
C3列的默认值obclient> ALTER TABLE tbl1 MODIFY C3 NUMBER(3) DEFAULT NULL;
再次执行 DESCRIBE tbl1; 命令查看 tbl1 表的表结构,输出如下,表 tbl1 中 C1 列的默认值为 111,C3 列的默认值为 NULL。
+-------+--------------+------+------+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+------+---------+-------+
| C1 | NUMBER(10) | NO | PRI | 111 | NULL |
| C2 | VARCHAR2(50) | NO | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+------+---------+-------+
管理约束
OceanBase 数据库 Oracle 模式下可为表增加列约束,如修改已有列为自增列、设置列是否可为空、指定列的唯一性等,本节将分别为您介绍如何操作。
管理约束的语法如下:
ALTER TABLE table_name
MODIFY column_name data_type
[NULL | NOT NULL]
[PRIMARY KEY]
[UNIQUE];
相关参数说明如下:
table_name:指定待增加约束的列所在表的表名。column_name:指定待增加约束的列的列名。data_type:指定待修改列的数据类型,您可指定为当前数据类型,也可指定将该列修改为其他数据类型,支持修改的数据类型可参见上文 修改列类型。NULL | NOT NULL:指定设置选定列可以为空(NULL),或不能为空(NOT NULL)。PRIMARY KEY:指定设置选定列为主键。UNIQUE:指定设置选定列的唯一性。
假设数据库中存在表 tbl1,tbl1 表结构信息如下所示:
+-------+--------------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+-----+---------+-------+
| C1 | NUMBER(10) | YES | NULL | NULL | NULL |
| C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
| C3 | NUMBER(3) | YES | NULL | NULL | NULL |
+-------+--------------+------+-----+---------+-------+
将
C1列设置为主键obclient> ALTER TABLE tbl1 MODIFY C1 NUMBER(10) PRIMARY KEY;将
C2列设置为不能为空obclient> ALTER TABLE tbl1 MODIFY C2 VARCHAR(50) NOT NULL;将
C3列设置为必须唯一obclient> ALTER TABLE tbl1 MODIFY C3 NUMBER(3) UNIQUE;再次执行
DESCRIBE tbl1;命令查看 tbl1 表的表结构+-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C1 | NUMBER(10) | NO | PRI | NULL | NULL | | C2 | VARCHAR2(50) | NO | NULL | NULL | NULL | | C3 | NUMBER(3) | YES | UNI | NULL | NULL | +-------+--------------+------+-----+---------+-------+
设置自增列值
设置自增列值必须使用 CREATE SEQUENCE 创建一个自动递增字段,然后使用 nextval 函数从序列中检索下一个值。
管理自增列值的示例如下:
创建自增序列
seq1,并设置起始值为 1,每次增加 1,缓存大小为 10obclient> CREATE SEQUENCE seq1 MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10;向 tbl1 表中插入数据
obclient> INSERT INTO tbl1(C1, C2, C3) VALUES (seq1.nextval, 'zhangsan', 20), (seq1.nextval, 'lisi', 21), (seq1.nextval, 'wangwu', 22);执行如下命令查看 tbl1 表数据
obclient> SELECT * FROM tbl1;输出如下,
C1列值从 1 开始递增。+------+----------+------+ | C1 | C2 | C3 | +------+----------+------+ | 1 | zhangsan | 20 | | 2 | lisi | 21 | | 3 | wangwu | 22 | +------+----------+------+通过手动触发
seq1序列自增修改自增列值obclient> SELECT seq1.nextval FROM sys.dual;输出如下:
+---------+ | NEXTVAL | +---------+ | 4 | +---------+再次向表 tbl1 中插入数据
obclient> INSERT INTO tbl1(C1, C2, C3) VALUES (seq1.nextval, 'oceanbase', 12);再次执行如下命令查看 tbl1 表数据
obclient> SELECT * FROM tbl1;输出如下,
C1列值中无取值为4的行,而是直接插入数值5。+------+-----------+------+ | C1 | C2 | C3 | +------+-----------+------+ | 1 | zhangsan | 20 | | 2 | lisi | 21 | | 3 | wangwu | 22 | | 5 | oceanbase | 12 | +------+-----------+------+