序列是一个数据库实体,通过它多个用户可以产生唯一整数值,可以用序列来自动地生
成主关键字值。
语句功能
创建一个序列。只有 DBA 或该序列的拥有者且具有 CREATE SEQUENCE 权限的用户才
能创建序列。
使用说明
- 一旦序列生成,就可以在 SQL 语句中用以下伪列来存取序列的值;
1 ) CURRVAL 返回当前的序列值;
2 ) NEXTVAL 如果为升序序列,序列值增加并返回增加后的值;如果为降序序列,
序列值减少并返回减少后的值。如果第一次对序列使用该函数,则返回序列当
前值;
3 ) 用户会话在第一次使用 CURRVAL 之前应先使用 NEXTVAL 获取序列当前值;
之后除非会话使用 NEXTVAL 获取序列当前值,否则每次使用 CURRVAL 返回
的值不变。 - 缺省序列:如果在序列中什么也没有指出则缺省生成序列,一个从 1 开始增量为 1
且无限上升 ( 最大值为 9223372036854775807) 的升序序列;仅指出
INCREMENT BY -1 ,将创建一个从 -1 开始且无限下降 ( 最小值为
-9223372036854775808) 的降序序列。 - LOCAL 类型序列的最高 10 位用来记录标识 MPP 节点号,因此 LOCAL 类型的序列
值和 GLOBAL 类型序列在范围、最大值、最小值上都有所差别。 LOCAL 类型序列
创建时可设置的最大值、最小值分别为 9007199254740991 、
-9007199254740992 。需要注意的是,最高 10 位设置了 MPP 站点号以后,列的真实值实
际上可能不会在序列定义的最大最小值范围内。
创建序列
CREATE SEQUENCE "SYSDBA"."TEST" INCREMENT BY 2 START WITH 1 MAXVALUE 10 MINVALUE 1;
SQL> select SYSDBA.TEST.CURRVAL;
select SYSDBA.TEST.CURRVAL;
[-7147]:序列当前值尚未在此会话中定义.
已用时间: 0.557(毫秒). 执行号:0.
SQL>
SQL> SELECT SYSDBA.TEST.NEXTVAL;
行号 NEXTVAL
---------- --------------------
1 1
已用时间: 0.487(毫秒). 执行号:1303.
SQL>
insert into SYSDBA.T30 VALUES(SYSDBA.TEST.NEXTVAL)
select * from "SYSDBA"."T30";
行号 COLUMN_1
---------- -----------
1 3
2 5
3 7
4 9
已用时间: 0.268(毫秒). 执行号:1304.
SQL>
SQL> insert into SYSDBA.T30 VALUES(SYSDBA.TEST.NEXTVAL);
insert into SYSDBA.T30 VALUES(SYSDBA.TEST.NEXTVAL);
[-7069]:序列溢出.
已用时间: 0.460(毫秒). 执行号:0.
SQL>
序列溢出:序列已经不能再产生足够的值。
alter sequence test.s1 maxvalue 30;
设置循环后,可以无限生成序列。
CREATE SEQUENCE "SYSDBA"."S1"
INCREMENT BY 2
START WITH 1
MAXVALUE 20
MINVALUE 1
CYCLE
CACHE 2
NOORDER ;
Select SYSDBA.S1.NEXTVAL;