在 OceanBase 数据库中,序列(Sequence)是 Oracle 租户的数据库对象,可以产生不重复的值,在表需要不重复的列做主键时很有用。

序列可以提供两个伪列 和 NEXTVAL,用于返回当前的序列值和下一个序列值。每当查询 NEXTVAL 都会推进 CURRVAL 值。

您可以使用 CREATE SEQUENCE 语句来创建序列。语法格式如下:

其中:

  • MINVALUEMAXVALUE 用于指定最小值和最大值。

  • START WITH 用于指定起始值。

  • CACHE 是为了性能缓存部分序列值,在并发高的时候使用。

    说明

    在分布式系统中使用 Sequence 时,如果您使用了 CACHE + NOORDER 选项,那么连接到不同机器时获得的序列不是有序递增的,但是可以保证唯一。

  • CYCLE 用于指定序列值是否循环。如果序列值循环,则需要指定最大值或最小值。

更多 CREATE SEQUENCE 语句的信息,请参见《SQL 参考(Oracle 模式)》文档中的 CREATE SEQUENCE 章节。

示例:创建序列,实现表的列自增。

  1. obclient> CREATE TABLE t1(id number NOT NULL PRIMARY KEY, name varchar(50) , gmt_create date NOT NULL DEFAULT SYSDATE);
  2. Query OK, 0 rows affected (0.07 sec)
  3. obclient> CREATE SEQUENCE seq_t1 START WITH 10000 INCREMENT BY 1 CACHE 50 NOCYCLE;
  4. obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'A');
  5. Query OK, 1 row affected (0.02 sec)
  6. obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'B');
  7. Query OK, 1 row affected (0.00 sec)
  8. obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'C');
  9. Query OK, 1 row affected (0.00 sec)
  10. obclient> SELECT * FROM t1;
  11. +-------+------+---------------------+
  12. | 10000 | A | 2020-04-02 18:30:29 |
  13. | 10001 | B | 2020-04-02 18:30:34 |
  14. | 10002 | C | 2020-04-02 18:30:39 |
  15. +-------+------+---------------------+
  16. 3 rows in set (0.01 sec)

示例如下:

序列创建成功后,您可以使用 ALTER SEQUENCE 语句来修改序列的属性。

OceanBase 数据库支持修改序列的最小值、最大值、步长和循环属性,不支持修改序列的起始值。修改序列的语法格式如下:

  1. ALTER SEQUENCE sequence_name
  2. [MINVALUE value | NOMINVALUE]
  3. [MAXVALUE value | NOMAXVALUE]
  4. [INCREMENT BY value]
  5. [CACHE value | NOCACHE]
  6. [ORDER | NOORDER]

更多 ALTER SEQUENCE 语句的信息,请参见《SQL 参考(Oracle 模式)》文档中的 章节。

示例:修改自增列 my_sequence 的最大值,并指定自增值循环生成。

您可以使用DROP SEQUENCE语句来删除序列,语法格式如下:

示例:删除自增列 S1。