定义一个新的序列生成器。
语法
CREATE SEQUENCE name [ INCREMENT BY increment ]
[ { NOMINVALUE | MINVALUE minvalue } ]
[ { NOMAXVALUE | MAXVALUE maxvalue } ]
[ START WITH start ] [ CACHE cache | NOCACHE ] [ CYCLE ]
参数
参数名称 | 描述 |
---|---|
name | 创建的序列的名称。 |
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(每次只产生一个值,例如,NOCHACHE),并且这也是默认值。
|
CYCLE | 当升序序列和降序序列达到各自的最大值和最小值,CYCLE选项允许序列返回到初始位置。如果达到了限制值,那么下一次产生的数值就是各自的最小值和最大值。如果没有使用CYCLE(这是默认设置),当序列达到最大值的时候,任何对NEXTVAL的调用将返回一个错误。注意关键字NO CYCLE可以用来保持缺省的动作。但是,这个关键字与Oracle不兼容。 |
描述
CREATE SEQUENCE命令用于创建一个新的序列数字生成器。这个操作涉及到创建和初始化一个名称为参数name所指定,带有单条记录的表。运行这条命令的用户是新创建序列生成器的所有者。
如果指定了模式名称,那么序列在指定模式中创建,否则就在当前模式中创建。在同一模式中,序列的名称不能与其他的序列、表、索引或者视图相同。
序列基于大整数算法,所以数值不能超过8字节长度的整数(从-9223372036854775808 到9223372036854775807)。在一些版本比较老的平台,可能没有编译器支持8字节长度的整数,在这种情况下,序列只能使用规则整数算法(范围是从-2147483648 to +2147483647)。
当多个会话并发访问一个缓存设置大于1的序列对象的时候,可能会取得不希望的结果。这是因为每一个会话在访问序列对象的过程中都要分配和缓存连续的序列值,因此都要增加序列对象的最新值。然后,会话中接下来cache-1次NEXTVAL函数的调用仅仅返回预先分配的值,而没有实际与序列对象联系。这样,当会话结束的时候,任何已分配但是没有在会话中使用的值将会丢失。这样就会在序列中产生一个漏洞。
此外,尽管可以保证对多个会话分配各自不同的序列值,但是当考虑到所有会话的时候,产生的相关数值还是会超出序列范围。例如,当缓存设置为10的时候,会话A可以保留数值1..10并且返回NEXTVAL=1,然后会话B可能保留数值11..20,然后在会话A产生NEXTVAL=2的前面返回NEXTVAL=11。因此把缓存设置设定为1是安全的,能够保证NEXTVAL值顺序产生:缓存设置大于1的时候,只能保证NEXTVAL值都是不同的,不能保证NEXTVAL值是顺序产生的。而且最后的值只是反映了任意一个会话所保留的值,无论它是不是已经通过NEXTVAL返回。
示例
创建一个名称为serial的升序序列,从101开始:
CREATE SEQUENCE serial START WITH 101;
从这个序列中选择下一个数值:
SELECT serial.NEXTVAL FROM DUAL;
nextval
---------
101
(1 row)
创建一个名称为supplier_seq的序列,使用NOCACHE选项:
CREATE SEQUENCE supplier_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
NOCACHE;
从这个序列中选择下一个值:
SELECT supplier_seq.NEXTVAL FROM DUAL;
nextval
---------
1
(1 row)