本节主要介绍如何创建、查看、修改和删除 Oracle 模式中序列。
在 OceanBase 数据库中,序列(Sequence)是 Oracle 租户的数据库对象,可以产生不重复的值,在表需要不重复的列做主键时很有用。
序列可以提供两个伪列 CURRVAL
和 NEXTVAL
,用于返回当前的序列值和下一个序列值。每当查询 NEXTVAL
都会推进 CURRVAL
值。
创建序列
您可以使用 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
语句的信息,请参见《SQL 参考(Oracle 模式)》文档中的 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 (0.07 sec)
obclient> CREATE SEQUENCE seq_t1 START WITH 10000 INCREMENT BY 1 CACHE 50 NOCYCLE;
Query OK, 0 rows affected (0.04 sec)
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>
修改序列
序列创建成功后,您可以使用 ALTER SEQUENCE
语句来修改序列的属性。
OceanBase 数据库支持修改序列的最小值、最大值、步长和循环属性,不支持修改序列的起始值。修改序列的语法格式如下:
ALTER SEQUENCE sequence_name
[MINVALUE value | NOMINVALUE]
[MAXVALUE value | NOMAXVALUE]
[INCREMENT BY value]
[CACHE value | NOCACHE]
[ORDER | NOORDER]
[CYCLE | NOCYCLE];
更多 ALTER SEQUENCE
语句的信息,请参见《SQL 参考(Oracle 模式)》文档中的 ALTER SEQUENCE 章节。
示例:修改自增列 my_sequence 的最大值,并指定自增值循环生成。
obclient> ALTER SEQUENCE my_sequence MAXVALUE 1024 CYCLE;
删除序列
您可以使用DROP SEQUENCE
语句来删除序列,语法格式如下:
DROP SEQUENCE sequence_name;
更多 DROP SEQUENCE
语句的信息,请参见《SQL 参考(Oracle 模式)》文档中的 DROP SEQUENCE 章节。
示例:删除自增列 S1。
obclient> DROP SEQUENCE S1;
Query OK, 0 rows affected (0.16 sec)