基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
OceanBase 数据库 Oracle 模式中序列介绍
更新时间:2026-08-13 07:41
本文主要介绍 OceanBase 数据库 Oracle 模式中序列的使用方法。
适用版本
OceanBase 数据库 V2.x、V3.x、V4.x 版本
与 Oracle 数据库序列的差异
OceanBase 数据库与 Oracle 数据库序列的差异如下表所示。
| 模式 | Oracle 数据库 | OceanBase 数据库 |
|---|---|---|
| NOCACHE wi th ORDER | 所有 instance 不缓存任何序列,使用时从全局 CACHE 中获取,CACHE 根据请求的先后顺序返回序列值。 | 所有 instance 不缓存任何序列,使用时从全局 CACHE 中获取,CACHE 根据请求的先后顺序返回序列值。 |
| NOCACHE with NOORDER | 所有 instance 不缓存任何序列,使用时从全局 CACHE 中获取,CACHE 可以根据 busy 程度延迟满足一些请求,导致 NOORDER。 | 仅语法兼容,实际效果与 NOCACHE with ORDER 相同。 |
| CACHE with ORDER | 每个 instance 都缓存相同的序列,使用之前需要通过全局锁来同步序列中的下一个可用位置。 | 仅语法兼容,实际效果因版本而异,详见下方说明。 |
| CACHE with NOORDER | 每个 instance 都缓存不同的序列,并且不需要全局同步 CACHE 状态。此时的值自然是 NOORDER。 | 每个 instance 都缓存不同的序列,并且不需要全局同步 CACHE 状态。此时的值自然是 NOORDER。 |
说明
- 在 OceanBase 数据库 V4.2.2 及以下版本中
CACHE with ORDER本质上就是 NOCACHE,每次获取序列值都会读写内部表。 - 在 OceanBase 数据库 V4.2.3 及以上版本中
CACHE with ORDER模式仅有一个 instance 缓存序列,使用时从该唯一 CACHE 中获取,CACHE 根据请求的先后顺序返回序列值。
出于性能考虑,OceanBase 数据库建议您使用默认的 CACHE with NOORDER 方式。
注意
OceanBase 数据库中,不建议使用 ORDER with NO CACHE ,这种模式下每次调用 NEXTVAL 都会触发一次内部表 SELECT 与 UPDATE,会影响数据库的性能。
在创建序列时,由于默认的 CACHE 值过小,需要手动声明。对于单机 TPS 为 100 时,CACHE SIZE 建议设置为 360000。
Oracle 模式中序列的基本语法
序列的增、删、改操作
创建序列
obclient> CREATE SEQUENCE sequence_name START WITH value INCREMENT BY value MINVALUE value MAXVALUE value CYCLE NOORDER CACHE 100000000;修改序列
obclient> ALTER SEQUENCE sequence_name INCREMENT BY value;删除序列
obclient> DROP SEQUENCE sequence_name;
使用序列
使用查询语句
obclient> SELECT sequence_name.nextval FROM table_name;使用插入语句
obclient> INSERT INTO table_name VALUES (sequence_name.nextval);使用修改语句
obclient> UPDATE table_name SET c1 = sequence_name.nextval;
有关序列的更多操作方法,请参见《OceanBase 数据库 SQL 参考(Oracle 模式)》。
使用限制
序列只可用于顶层 SELECT ITEM、INSERT 值与 UPDATE 赋值。
序列不可用于子查询、Filter、group by 等语句。
例如在 OceanBase 数据库中执行以下查询都会产生错误。
obclient> SELECT * FROM t1 WHERE t1.pk IN (SELECT s1.nextval FROM dual); ERROR-02287: sequence number not allowed here obclient> SELECT * FROM t1 WHERE t1.pk IN (SELECT s1.nextval FROM t1); ERROR-02287: sequence number not allowed here obclient> SELECT * FROM t1 WHERE i = s1.nextval; ERROR-02287: sequence number not allowed here obclient> SELECT * FROM t_part GROUP BY s1.nextval; ERROR-02287: sequence number not allowed here obclient> SELECT * FROM t_part ORDER BY s1.nextval; ERROR-02287: sequence number not allowed here obclient> SELECT avg(s1.nextval) FROM dual; ERROR-02287: sequence number not allowed here obclient> SELECT avg(s1.nextval) FROM t1; ERROR-02287: sequence number not allowed here obclient> SELECT distinct s1.nextval FROM t1; ERROR-02287: sequence number not allowed here
常见问题
Q: OceanBase 数据库 Oracle 租户中,序列能够保证连续递增吗?
A:
单机内保证递增,多机之间不保证递增。
单机和多机都不保证连续。
如果发生了宕机或执行了回滚,则值可能出现跳跃。因此如果您需要严格等差递增序列时,不建议您使用数据库中的序列。
Q: OceanBase 数据库的创建 sequence 时使用 noorder 选项,是否保证单调递增且唯一?
A: 不保证单调递增,但是保证唯一。