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