首批通过分布式安全可靠测评,为关键业务系统打造
管理序列
更新时间:2026-03-13 15:31:13
本节主要介绍如何创建、查看、修改和删除 Oracle 模式中序列。
在 OceanBase 数据库中,序列(Sequence)是 Oracle 租户的数据库对象,可以产生不重复的值,在表需要不重复的列做主键时很有用。
序列可以提供两个伪列 CURRVAL和 NEXTVAL,用于返回当前的序列值和下一个序列值。每当查询 NEXTVAL 都会推进 CURRVAL 值。
序列的使用限制
- 不能与
HAVING、ORDER BY和GROUP BY等语句同时使用。 - 不能在子查询中出现(
INSERT INTO SELECT的情况除外)。 - 不能出现在
WHERE表达式中。
创建序列
您可以使用 CREATE SEQUENCE 语句来创建序列。语法格式如下:
CREATE SEQUENCE sequence_name
[MINVALUE value | NOMINVALUE]
[MAXVALUE value | NOMAXVALUE]
[START WITH value]
[INCREMENT BY value]
[CACHE value | NOCACHE]
[ORDER | NOORDER]
[CYCLE | NOCYCLE];
其中:
MINVALUE和MAXVALUE用于指定最小值和最大值。START WITH用于指定起始值。INCREMENT BY用于指定步长,可以为负数,默认为 1。CACHE是为了性能缓存部分序列值,在并发高的时候使用。说明
在分布式系统中使用 Sequence 时,如果您使用了
CACHE+NOORDER选项,那么连接到不同机器时获得的序列不是有序递增的,但是可以保证唯一。CYCLE用于指定序列值是否循环。如果序列值循环,则需要指定最大值或最小值。
更多 CREATE SEQUENCE 语句的信息,请参见 CREATE SEQUENCE。
示例:创建序列,实现表的列自增。
obclient> CREATE TABLE t1(id number NOT NULL PRIMARY KEY, name varchar(50) , gmt_create date NOT NULL DEFAULT SYSDATE);
Query OK, 0 rows affected
obclient> CREATE SEQUENCE seq_t1 START WITH 10000 INCREMENT BY 1 CACHE 50 NOCYCLE;
Query OK, 0 rows affected
obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'A');
Query OK, 1 row affected (0.02 sec)
obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'B');
Query OK, 1 row affected (0.00 sec)
obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'C');
Query OK, 1 row affected (0.00 sec)
obclient> SELECT * FROM t1;
+-------+------+---------------------+
| ID | NAME | GMT_CREATE |
+-------+------+---------------------+
| 10000 | A | 2020-04-02 18:30:29 |
| 10001 | B | 2020-04-02 18:30:34 |
| 10002 | C | 2020-04-02 18:30:39 |
+-------+------+---------------------+
3 rows in set (0.01 sec)
查看序列
序列创建成功后,可以通过 USER_SEQUENCES、ALL_SEQUENCES 和 DBA_SEQUENCES 视图来查看自己创建的序列。
示例如下:
obclient> SELECT * FROM USER_SEQUENCES \G
*************************** 1. row ***************************
SEQUENCE_NAME: SEQ_T1
MIN_VALUE: 1
MAX_VALUE: 9999999999999999999999999999
INCREMENT_BY: 1
CYCLE_FLAG: N
ORDER_FLAG: N
CACHE_SIZE: 50
LAST_NUMBER: 10100
1 row in set (0.00 sec)
obclient>
更多 DBA_SEQUENCES 视图的字段及说明信息请参见 DBA_SEQUENCES。
更多 ALL_SEQUENCES 视图的字段及说明信息请参见 ALL_SEQUENCES。
更多 USER_SEQUENCES 视图的字段及说明信息请参见 USER_SEQUENCES。
修改序列
序列创建成功后,您可以使用 ALTER SEQUENCE 语句来修改序列的属性。
OceanBase 数据库支持修改序列的起始值、最小值、最大值、步长和循环属性。修改序列的 SQL 语法如下:
ALTER SEQUENCE sequence_name
{
[RESTART]
|[START WITH int_value]
|[ MINVALUE value | NOMINVALUE ]
|[ MAXVALUE value | NOMAXVALUE ]
|[ INCREMENT BY value ]
|[ CACHE value | NOCACHE ]
|[ ORDER | NOORDER ]
|[ CYCLE | NOCYCLE]
};
更多 ALTER SEQUENCE 语句的信息,请参见 ALTER SEQUENCE。
示例:
修改序列
seq2的最大值,并指定自增值循环生成。obclient> ALTER SEQUENCE seq2 MAXVALUE 1024 CYCLE;修改序列的起始值。
如果
INCREMENT BY的值大于0,则可以重置序列后,让其取值从MINVALUE开始;如果INCREMENT BY的值小于0,则可以重置序列后,让其取值从MAXVALUE开始,语句如下:obclient> ALTER SEQUENCE seq3 RESTART; Query OK, 0 rows affected重置序列,并让其取值从
3开始,语句如下:obclient> ALTER SEQUENCE seq4 RESTART START WITH 3; Query OK, 0 rows affected
修改序列的起始值时,
RESTART在语句中的位置并不一定要求在序列名后,它可以在语句中的任意位置,示例如下:obclient> ALTER SEQUENCE seq4 START WITH 3 RESTART MINVALUE -100 CYCLE; Query OK, 0 rows affected
删除序列
您可以使用DROP SEQUENCE语句来删除序列,语法格式如下:
DROP SEQUENCE sequence_name;
更多 DROP SEQUENCE 语句的信息,请参见 DROP SEQUENCE。
示例:删除序列 S1。
obclient> DROP SEQUENCE S1;
Query OK, 0 rows affected
清除 Sequence 缓存
为防止其他的 Sequence 缓存过期问题,OceanBase 数据库从 V4.4.1 版本开始引入 ALTER SYSTEM FLUSH SEQUENCE CACHE 语句,用于主动清除 Sequence 缓存,以便发生问题后能快速恢复。语法格式如下:
ALTER SYSTEM FLUSH SEQUENCE CACHE
SEQUENCE_NAME = sequence_name
[GLOBAL];
更多有关清除 Sequence 缓存语句的信息,参见 ALTER SYSTEM FLUSH SEQUENCE CACHE。
示例如下:
在当前租户及 DataBase 下,清除本节点上名为 test_seq1 的 Sequence 的缓存。
obclient> ALTER SYSTEM FLUSH SEQUENCE CACHE
SEQUENCE_NAME = test_seq1;