本节主要介绍如何创建、查看、修改和删除 Oracle 模式中序列。

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

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

创建序列

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

  1. CREATE SEQUENCE sequence_name
  2. [MINVALUE value | NOMINVALUE]
  3. [MAXVALUE value | NOMAXVALUE]
  4. [START WITH value]
  5. [INCREMENT BY value]
  6. [CACHE value | NOCACHE]
  7. [ORDER | NOORDER]
  8. [CYCLE | NOCYCLE];

其中:

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

  • START WITH 用于指定起始值。

  • INCREMENT BY 用于指定步长,可以为负数,默认为 1。

  • 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. Query OK, 0 rows affected (0.04 sec)
  5. obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'A');
  6. Query OK, 1 row affected (0.02 sec)
  7. obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'B');
  8. Query OK, 1 row affected (0.00 sec)
  9. obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'C');
  10. Query OK, 1 row affected (0.00 sec)
  11. obclient> SELECT * FROM t1;
  12. +-------+------+---------------------+
  13. | ID | NAME | GMT_CREATE |
  14. +-------+------+---------------------+
  15. | 10000 | A | 2020-04-02 18:30:29 |
  16. | 10001 | B | 2020-04-02 18:30:34 |
  17. | 10002 | C | 2020-04-02 18:30:39 |
  18. +-------+------+---------------------+
  19. 3 rows in set (0.01 sec)

查看序列

序列创建成功后,可以通过 USER_SEQUENCES、ALL_SEQUENCES 和 DBA_SEQUENCES 视图来查看自己创建的序列。

示例如下:

  1. obclient> SELECT * FROM USER_SEQUENCES \G
  2. *************************** 1. row ***************************
  3. SEQUENCE_NAME: SEQ_T1
  4. MIN_VALUE: 1
  5. MAX_VALUE: 9999999999999999999999999999
  6. INCREMENT_BY: 1
  7. CYCLE_FLAG: N
  8. ORDER_FLAG: N
  9. CACHE_SIZE: 50
  10. LAST_NUMBER: 10100
  11. 1 row in set (0.00 sec)
  12. obclient>

修改序列

序列创建成功后,您可以使用 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]
  7. [CYCLE | NOCYCLE];

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

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

  1. obclient> ALTER SEQUENCE my_sequence MAXVALUE 1024 CYCLE;

删除序列

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

  1. DROP SEQUENCE sequence_name;

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

示例:删除自增列 S1。

  1. obclient> DROP SEQUENCE S1;
  2. Query OK, 0 rows affected (0.16 sec)