语法

CREATE SEQUENCE name [ INCREMENT BY increment ]
  [ { NOMINVALUE | MINVALUE minvalue } ]
  [ { NOMAXVALUE | MAXVALUE maxvalue } ]
  [ START WITH start ] [ CACHE cache | NOCACHE ] [ CYCLE ]

CREATE SEQUENCE 可创建新的序列号生成器。这涉及到创建并初始化一个新的特殊的单行表,其名称为 name。生成器将由发布命令的用户拥有。

如果给定 schema 名称,则在指定的 schema 中创建序列,否则将在当前 schema 中创建序列。序列名称必须与同一 schema 中其他任何序列、表、索引或视图的名称有所区别。

创建序列之后,可使用 NEXTVAL 和 CURRVAL 对序列进行操作。

CYCLE CYCLE 选项允许当升序序列或降序序列分别达到 maxvalue 或 minvalue 时,序列回绕。如果达到限制值,则生成的下一个数字将分别为 minvalue 或 maxvalue。

如果省略 CYCLE(默认值),则在序列达到其最大值后,对 NEXTVAL 的任何调用将返回错误。请注意,可以使用关键字 NO CYCLE 来获得默认行为,但是此关键字与 Oracle 不兼容。

序列基于大整数运算,因此范围不能超过八字节整数的范围(-9223372036854775808 到 9223372036854775807)。在某些较早的平台上,编译器可能不支持八字节整数,在此情况下序列采用常规 INTEGER 运算(范围从 -2147483648 到 +2147483647)。

如果由多个会话同时使用的序列对象采用大于 1 的 cache 设置,则可能会获得意外的结果。每个会话在每次访问序列对象期间都将分配并缓存连续的序列值,从而增大了序列对象最后的值。随后,接下来该会话中 cache-1 次使用 NEXTVAL 只是返回预分配的值,而不触及序列对象。因此,当会话结束时,会话中已分配但并未使用的任何数值都将丢失,从而导致序列中出现若干“洞”。

此外,尽管可以保证为多个会话分配不同的序列值,但是当考虑所有会话时,可以不按顺序生成这些值。例如,当 cache 设置为 10 时,会话 A 可能会保留值 1..10 并返回 NEXTVAL=1,然后会话 B 可能会保留值 11..20 并返回 NEXTVAL=11,但之后会话 A 生成了 NEXTVAL=2。因此,当 cache 设置为 1 时,可以安全地假设 NEXTVAL 值是按顺序生成的。当 cache 设置大于 1 时,应当只假定 NEXTVAL 值全都是不同的,而不是纯粹按顺序生成的。此外,最后一个值体现的是任何会话保留的最新值,无论它是否已由 NEXTVAL 返回。

创建名为 serial 的升序序列,从 101 开始:

CREATE SEQUENCE serial START WITH 101;

从该序列中选择下一个数:

SELECT serial.NEXTVAL FROM DUAL;
 nextval
---------
(1 row)

采用 NOCACHE 选项,创建名为 supplier_seq 的序列:

CREATE SEQUENCE supplier_seq
    MINVALUE 1
    START WITH 1
    INCREMENT BY 1
    NOCACHE;

从该序列中选择下一个数:

SELECT supplier_seq.NEXTVAL FROM DUAL;
 nextval
---------
(1 row)