定义新序列生成器。
语法
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 和 -263-1。请注意,可使用关键字 NOMINVALUE 将此行为设置为默认。 |
NOMAXVALUE | MAXVALUE maxvalue | 可选子句 MAXVALUE maxvalue 确定序列的最大值。如果未提供此子句,则将使用默认值。升序序列和降序序列的默认值分别为 263-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)