跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

sequence的MAXVALUE、NOMAXVALUE和CYCLE、NOCYCLE参数

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是默认值。

相关文章