Skip to content

创建序列值

序列值主要用于产生整数序列值,其产生整数值按照用户指定规则进行递增或递减。

主要语法结构

语法格式

sql
CreateSeqStmt::=
    CREATE SEQUENCE [IF NOT EXISTS] sequence_name [OptSeqList] [COMMENT SCONST]

参数说明

  • IF NOT EXISTS:创建序列值时若同名序列值存在则忽略错误。该关键字无法验证已有同名序列值与当前创建序列值属性是否一致。
  • sequence_name:序列值名称。
  • OptSeqList:可选的序列值表达式,用来指定序列值的最小值、最大值、起始值、增长步长等约束条件。
  • COMMENT SCONST:可选的序列值注释信息。

序列值表达式OptSeqList

语法格式

sql
OptSeqList::=
    [OptSeqElem]... 
    
OptSeqElem::=
    START WITH var_value
|		[CACHE var_value | NOCACHE]
|   [CYCLE | NOCYCLE]
|   INCREMENT BY var_value  
|   [MAXVALUE var_value | NOMAXVALUE ]
|   [MINVALUE var_value | NOMINVALUE ]

参数说明

  • START WITH var_valuevar_value为序列的初始值;如果序列递增,未指定初始值,则初始值为最小值;如果序列递减,未指定初始值,则初始值为最大值。
  • [CACHE var_value | NOCACHE]value是缓存序列值个数,默认1;若系统重启,则序列值起始值将变为cache后的下一个值。
    集群环境下,缓存在当前工作节点1,若在工作节点2使用序列值,则序列值起始站为节点1 cache后的下一个值,其他工作节点使用起始值依此类推。
    举例:(起始值1,cache 20,节点1:1-20,节点2:21-40,节点3:41-60......; 集群重启后序列值起始值从61开始)。
  • [CYCLE | NOCYCLE]:值达到最大值后是否循环,如果不循环,达到最大值后,继续产生新值会发生错误;默认不循环。
  • INCREMENT BY var_valuevar_value为序列步长(序列增加的幅度),默认为1,如果是负则按此步长递减。
  • [MAXVALUE var_value | NOMAXVALUE ]:定义序列生成器能产生的最大值,如果序列递减,未指定最大值,默认为-1;NOMAXVALUE无最大值限制(默认为9223372036854775807)。
  • [MINVALUE var_value | NOMINVALUE ]:定义序列生成器能产生的最小值,如果序列递增,未指定最小值,默认为1;NOMINVALUE无最小值限制(默认为-9223372036854775808)。

示例

  • 示例1
    创建一个名为seq_test的序列值,该序列值最小值为1,最大值为1000,起始值为100,步长为1。

    sql
    CREATE SEQUENCE seq_test MINVALUE 1 MAXVALUE 1000 START WITH 100 INCREMENT BY 1;
  • 示例2
    NOMINVALUE:没有最小值定义,对于递减序列,数据库能够产生的最小值是BIGINT的最小值;对于递增序列,最小值是1。
    NOMAXVALUE:没有最大值定义,对于递增序列,数据库能够产生的最大值是BIGINT的最大值;对于递减序列,最大值是-1。

    sql
    --(1)NOMINVALUE、MAXVALUE xxxxx
    CREATE SEQUENCE seq1 START WITH 1 NOMINVALUE MAXVALUE 1000 NOCYCLE CACHE 500 ORDER;
    
    --(2)NOMAXVALUE、MINVALUE xxxxx
    CREATE SEQUENCE seq2 START WITH 10 MINVALUE 1 NOMAXVALUE NOCYCLE CACHE 500 ORDER;
    
    --(3)NOMINVALUE、NOMAXVALUE
    CREATE SEQUENCE seq3 START WITH 10  NOMINVALUE NOMAXVALUE NOCYCLE CACHE 500 ORDER;
    
    --(4)MINVALUE xxxxx、MAXVALUE xxxxx
    CREATE SEQUENCE seq4 START WITH 10 MINVALUE 1 MAXVALUE 1000 NOCYCLE CACHE 500 ORDER;
  • 示例3
    创建一个与原序列值名称相同但最大值属性不同的序列值,不会影响原序列值。

    sql
    SQL> CREATE SEQUENCE IF NOT EXISTS seq_1
        MINVALUE 100 
        MAXVALUE 200 
        START WITH 199 
        INCREMENT BY -100 
        CYCLE;
    SQL> SELECT ds.seq_name,ds.max_val FROM dba_sequences ds WHERE ds.seq_name='SEQ_1';
    SEQ_NAME	|MAX_VAL
    ---------------------
    SEQ_1	    |200
    SQL> CREATE SEQUENCE IF NOT EXISTS seq_1 /*创建一个与原序列值MAXVALUE不同的序列值,此处会返回警告*/
        MINVALUE 100 
        MAXVALUE 500 
        START WITH 199 
        INCREMENT BY -100 
        CYCLE;
    SQL> SELECT ds.seq_name,ds.max_val FROM dba_sequences ds WHERE ds.seq_name='SEQ_1';/*不会对原序列值产生影响*/
    SEQ_NAME	|MAX_VAL
    ---------------------
    SEQ_1	    |200