欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

sequence的MAXVALUE、NOMAXVALUE和CYCLE、NOCYCLE参数

程序员文章站 2022-05-01 08:51:20
...

Oracle的sequence通常可以用来作自增列,例如主键,因为他可以自动累加并且唯一。创建sequence时有几个参数,MAXVALUE、MINVALUE、CYCLE、NOCYCLE、NOMAXVALUE等,这几个参数我们日常使用的时候可能不会太在意,但有些细节问题碰到的时候就需要明确下。 1、

Oracle的sequence通常可以用来作自增列,例如主键,因为他可以自动累加并且唯一。创建sequence时有几个参数,MAXVALUE、MINVALUE、CYCLE、NOCYCLE、NOMAXVALUE等,这几个参数我们日常使用的时候可能不会太在意,但有些细节问题碰到的时候就需要明确下。

1、未定义NOCYCLE,默认是NOCYCLE还是CYCLE?

CREATE SEQUENCE test_seq
start with 1
increment by 1
MAXVALUE 2
cache 20;

SELECT test_seq.nextval FROM DUAL;取值为1。

SELECT test_seq.nextval FROM DUAL;取值为2。

SELECT test_seq.nextval FROM DUAL;报错:ORA-08004: sequence TEST_SEQ.NEXTVAL exceeds MAXVALUE and cannot be instantiated,说明未指定的情况下,默认是NOCYCLE。

2、未定义MAXVALUE,默认是MAXVALUE还是NOMAXVALUE?

CREATE SEQUENCE tes_seq
start with 1
increment by 1
cache 20;

查看MAXVALUE取值是999999999999999999999999999,说明默认是MAXVALUE。

3、MAXVALUE最大值究竟是多少?

CREATE SEQUENCE tes_seq
start with 1

maxvalue 29个9
increment by 1
cache 20;

提示:ORA-04003:sequence parameter MAXVALUE exceeds maximum size allowed (28 digits)

说明最大允许28位。

创建了28位的MAXVALUE,并且设置CYCLE:

CREATE SEQUENCE test_seq
start with 9999999999999999999999999998
MAXVALUE 9999999999999999999999999999
increment by 1
CYCLE;
此时执行:SELECT test_seq. nextval FROM DUAL;,返回值是1E28,真正应是9999999999999999999999999998,
此时test_seq显示NEXT NUMBER是10000000000000000000000000000。
再执行一次SELECT test_seq. NEXTVAL FROM DUAL;,值还是1E28。但实际值是9999999999999999999999999999,下面例子可以证明,最大值是10的28次方。
再执行一次SELECT test_seq. nextval FROM DUAL;,此时值=1。,

CREATE SEQUENCE test_seq
start with 9999999999999999999999999999
MAXVALUE 10000000000000000000000000000
increment by 1
CYCLE;

SELECT test_seq. nextval FROM DUAL;返回9999999999999999999999999999,

再执行一次SELECT test_seq. nextval FROM DUAL;就会报ORA-08004错误。进一步说明最大值是28个9数字。

4、使用NOMAXVALUE就可以使用无限大值?

CREATE SEQUENCE test_seq
start with 1
NOMAXVALUE
increment by 1
cache 20;

此时test_seq显示MAX VALUE是999999999999999999999999999,27个9数字。

说明即使设置NOMAXVALUE,仍有最大值限制。

结论:

MAXVALUE最大值是28个9,用科学计数法将最大值记做1E28,换句话说,即使设置NOMAXVALUE,也是有这个最大值的。

NOCYCLE是默认值。