版本:7.0.0

CREATE SEQUENCE ​

功能描述 ​

序列(Sequence)是数据库中一种特殊对象,用于生成唯一、递增或递减的数值序列。 CREATE SEQUENCE用于向当前数据库中增加一个新的序列生成器。序列的Owner为创建此序列的用户。

注意事项 ​

  • 序列创建后,可通过 NEXTVAL 和 CURRVAL 获取序列值。
  • 同一模式内序列名称必须唯一。
  • 使用 CACHE 选项可在内存中预分配序列号,提升性能,但异常退出时可能导致部分序列号丢失。

语法格式 ​

sql
CREATE SEQUENCE [schema.]sequence_name
[INCREMENT BY INCREMENT_VALUE] | 
[ START WITH START_VALUE ] | 
[{MINVALUE MIN_VALUE} | {NOMINVALUE}]
[{MAXVALUE MAX_VALUE} | {NOMAXVALUE}]
[{CYCLE} | {NOCYCLE}]
[{CACHE CACHE_SIZE} | {NOCACHE}]
[{ORDER} | {NOORDER}];

参数说明 ​

  • [schema.]sequence_name: 将要创建的序列名称。如果指定了模式名,则序列将在该模式中创建,否则将在当前模式中创建。
  • INCREMENT BY INCREMENT_VALUE: 指定序列的步长。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。缺省值默认为1。
  • START WITH START_VALUE: 指定序列的起始值。缺省值:对于递增序列为MIN_VALUE,递减序列为MAX_VALUE。
  • [{MINVALUE MIN_VALUE} | {NOMINVALUE}]: 指定序列的最小值。
    • 如果没有声明MINVALUE或者声明了NOMINVALUE,则递增序列的缺省值为1,递减序列的缺省值为-2^63+1。
  • [{MAXVALUE MAX_VALUE} | {NOMAXVALUE}]: 指定序列的最大值。
    • 如果没有声明MAXVALUE或者声明了NOMAXVALUE,则递增序列的缺省值为2^63-1,递减序列的缺省值为-1。
  • [{CYCLE} | {NOCYCLE}]: 用于使序列达到MAX_VALUE或者MIN_VALUE后可循环并继续下去。
    • 如果声明了NOCYCLE,则在序列达到其最大值后任何对NEXTVAL的调用都会返回一个错误。
    • 若定义序列为CYCLE,则不能保证序列的唯一性。
    • 缺省值为NOCYCLE。
  • [{CACHE CACHE_SIZE} | {NOCACHE}]: 为了快速访问,而在内存中预先存储序列号的个数。
    • 如果声明了CACHE,则在内存中缓存CACHE_SIZE个序列号,每次调用nextval()函数时,会从缓存中返回一个序列号。如果缓存为空,则会从数据库中读取序列号。
    • 如果声明了CACHE,CACHE_SIZE的默认值为20,最小为2。
    • 如果声明了NOCACHE,则每次调用nextval()函数时,都会从数据库中读取序列号。
  • [{ORDER} | {NOORDER}]: 用于指定序列是否按顺序生成。
    • 如果声明了ORDER,则保证序列号按照请求顺序生成。
    • 如果声明了NOORDER,则序列不按顺序生成。
    • 缺省值为NOORDER。

示例 ​

-- 最基础的序列创建示例
-- 序列名称 MY_SEQUENCE MIN_VALUE 1 MAX_VALUE 2^63-1 INCREMENT_BY 1 CYCLE_FLAG 0 ORDER_FLAG 0 CACHE_SIZE 20
SQL> CREATE SEQUENCE my_sequence;

Succeed.

SQL> SELECT * FROM ADM_SEQUENCES where SEQUENCE_NAME = 'MY_SEQUENCE';

SEQUENCE_OWNER                                                   SEQUENCE_NAME                                                    MIN_VALUE            MAX_VALUE            INCREMENT_BY         CYCLE_FLAG   ORDER_FLAG   CACHE_SIZE           LAST_NUMBER         
---------------------------------------------------------------- ---------------------------------------------------------------- -------------------- -------------------- -------------------- ------------ ------------ -------------------- --------------------
SYS                                                              MY_SEQUENCE                                                      1                    9223372036854775807  1                    0            0            20                   1                   

1 rows fetched.

-- 递增序列创建 序列名称 MY_SEQUENCE 
-- 最小值 10 最大值 1000 
-- 递增步长 5 是否循环 TRUE 是否有序 TRUE 
-- 缓存数量 50
SQL> CREATE SEQUENCE my_sequence
  2 INCREMENT BY 5
  3 START WITH 100
  4 MINVALUE 10
  5 MAXVALUE 1000
  6 CYCLE
  7 CACHE 50
  8 ORDER;

Succeed.

SQL> SELECT * FROM ADM_SEQUENCES where SEQUENCE_NAME = 'MY_SEQUENCE';

SEQUENCE_OWNER                                                   SEQUENCE_NAME                                                    MIN_VALUE            MAX_VALUE            INCREMENT_BY         CYCLE_FLAG   ORDER_FLAG   CACHE_SIZE           LAST_NUMBER         
---------------------------------------------------------------- ---------------------------------------------------------------- -------------------- -------------------- -------------------- ------------ ------------ -------------------- --------------------
SYS                                                              MY_SEQUENCE                                                      10                   1000                 5                    1            1            50                   100                 

1 rows fetched.

-- 创建递减序列 序列名称 MY_SEQUENCE 
-- 最小值 -2^63+1 最大值 10000 
-- 递减步长 -10 是否循环 FALSE 是否有序 FALSE 
-- 缓存数量 50
SQL> CREATE SEQUENCE my_sequence
  2 INCREMENT BY -10
  3 START WITH 10000
  4 NOMINVALUE
  5 MAXVALUE 10000
  6 NOCYCLE
  7 CACHE 50
  8 NOORDER;

Succeed.

SQL> SELECT * FROM ADM_SEQUENCES where SEQUENCE_NAME = 'MY_SEQUENCE';

SEQUENCE_OWNER                                                   SEQUENCE_NAME                                                    MIN_VALUE            MAX_VALUE            INCREMENT_BY         CYCLE_FLAG   ORDER_FLAG   CACHE_SIZE           LAST_NUMBER         
---------------------------------------------------------------- ---------------------------------------------------------------- -------------------- -------------------- -------------------- ------------ ------------ -------------------- --------------------
SYS                                                              MY_SEQUENCE                                                      -9223372036854775808 10000                -10                  0            0            50                   10000               

1 rows fetched.