#CREATE SEQUENCE

# 通用描述

CREATE SEQUENCE用于创建一个序列对象,包括升序序列号生成器(生成的序列号为正数)和降序序列号生成器(生成的序列号为负数)。

序列号生成器的数据类型只能为整数。

对于升序序列号生成器,生成的序列号不能小于1;对于降序序列号生成器,生成的序列号不能大于-1。

分布式部署中用户无法执行本语句。

# 语句定义

create sequence::=

syntax
CREATE SEQUENCE schema . sequence INCREMENT BY START WITH integer MAXVALUE integer NOMAXVALUE MINVALUE integer NOMINVALUE CYCLE NOCYCLE ORDER NOORDER CACHE integer NOCACHE

# sequence

该语句用于指定要创建的序列号生成器的名称,不可省略,且需符合YashanDB的对象命名规范

如该语句后面的语句全部省略,则会生成一个从1开始,每次增长1,无最大数限制(但满足操作系统最大整数限制)的升序序列号生成器。

示例

CREATE SEQUENCE seq_yashan1;
 
SELECT seq_yashan1.NEXTVAL FROM DUAL;
  SEQ_YASHAN1.NEXTVAL
---------------------
                    1

# increment by

该语句用于指定序列号生成器的增量(Interval),即下一序列号值=当前序列号值+增量。该值不能为0,省略则默认为1。

本值为正数即表示创建的是一个升序序列号生成器,为负数则表示创建的是一个降序序列号生成器。

# start with

该语句用于指定序列号生成器的起始值,该值需介于MINVALUE和MAXVALUE之间。对于升序序列号生成器,本值不能小于1;对于降序序列号生成器,本值不能大于-1。省略则默认为1(升序序列号生成器)或-1(降序序列号生成器)。

# maxvalue|nomaxvalue

该语句用于指定序列号生成器的最大值,对于升序序列号生成器,本值不能小于1;对于降序序列号生成器,本值不能大于-1。

对于升序序列号生成器,NOMAXVALUE表示为操作系统的最大正整数数值;对于降序序列号生成器,NOMAXVALUE表示为-1。

本语句省略时默认为NOMAXVALUE。

# minvalue|nominvalue

该语句用于指定序列号生成器的最小值,对于升序序列号生成器,本值不能小于1;对于降序序列号生成器,本值不能大于-1。

对于升序序列号生成器,NOMINVALUE表示为1;对于降序序列号生成器,NOMAXVALUE表示为操作系统的最大负整数数值。

本语句省略时默认为NOMINVALUE。

# cycle|nocycle

该语句用于指定当生成的序列号到达MAXVALUE(升序序列号生成器)或MINVALUE(降序序列号生成器)后,是否开启序列号循环。

  • CYCLE:对于升序序列号生成器,当要生成的序列号大于MAXVALUE时,将该序列号置为MINVALUE;对于降序序列号生成器,当要生成的序列号小于MINVALUE时,将该序列号置为MAXVALUE。
  • NOCYCLE:当要生成的序列号大于MAXVALUE(升序序列号生成器)或小于MINVALUE(降序序列号生成器)时,不产生值并返回错误信息。

本语句省略时默认为NOCYCLE。

示例

--创建一个最大值为20的升序序列号生成器
CREATE SEQUENCE seq_yashan3 INCREMENT BY 10 MAXVALUE 20 CYCLE NOCACHE;
 
--当要生成的序列号超过20时,重新从最小值1开始
SELECT seq_yashan3.NEXTVAL FROM DUAL;
  SEQ_YASHAN3.NEXTVAL
---------------------
                    1
SELECT seq_yashan3.NEXTVAL FROM DUAL;
  SEQ_YASHAN3.NEXTVAL
---------------------
                   11
SELECT seq_yashan3.NEXTVAL FROM DUAL;
  SEQ_YASHAN3.NEXTVAL
---------------------
                    1

--创建一个含自增列的表
CREATE TABLE area(area_no INT DEFAULT seq_yashan3.NEXTVAL, area_name VARCHAR2(60));

# order|noorder

ORDER/NOORDER用于指定是否保证序列号按请求的先后顺序生成。

在单机部署中,YashanDB已保证了序列号按照请求的先后顺序生成,无需进行指定。本语句只用于语法兼容。

# cache|nocache

该语句用于指定是否在内存中对序列号进行预分配,省略则默认为在内存中预分配20个序列号。

  • NOCACHE:不在内存中进行序列号预分配。
  • CACHE:指定预分配序列号的个数。当同时指定NOCYCLE时,本值可为任意一个非0正整数;当同时指定CYCLE时,本值的大小不能超过序列号生成器一个循环内可产生的序列号个数,即小于(MAXVALUE-MINVALE)/ABS(INCREMENT BY) +1

示例

 --由于((11-1)/10)+1=2,而cache值需小于此值,返回错误
CREATE SEQUENCE seq_yashan4 INCREMENT BY 10 MAXVALUE 11 CYCLE CACHE 2;
YAS-02096 sequence param CACHE error, number of CACHE must be less than one cycle