定义新序列生成器

语法

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 对序列进行操作。

参数

参数 说明
name 要创建的序列的名称(可能是 schema 限定的)。
increment 可选子句 INCREMENT BY increment 指定要添加到当前序列值以创建一个新值的值。正值将生成升序序列,负值将生成降序序列。默认值为 1。
NOMINVALUE | MINVALUE minvalue 可选子句 MINVALUE minvalue 确定序列可生成的最小值。如果未提供此子句,则将使用默认值。升序序列和降序序列的默认值分别为 1 和 -2 63 -1。请注意,可使用关键字 NOMINVALUE 将此行为设置为默认。
NOMAXVALUE | MAXVALUE maxvalue 可选子句 MAXVALUE maxvalue 确定序列的最大值。如果未提供此子句,则将使用默认值。升序序列和降序序列的默认值分别为 2 63 -1 和 -1。请注意,可使用关键字 NOMAXVALUE 将此行为设置为默认。
start 可选子句 START WITH start 允许序列从任意位置开始。升序序列的默认起始值为 minvalue,降序序列的默认起始值为 maxvalue。
cache 可选子句 CACHE cache 指定要预先分配多少序列号并存储在内存中以便更快地访问。最小值为 1(一次只能生成一个值,如 NOCACHE),并且此值也是默认值。
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
---------
     101
(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
(1 row)