序列(sequence)就是所谓的序列号,每次取的时候它会自动增加。
关于创建序列的一点问题:
创建序列的基本语法为:
create sequence My_First_Sequence
start with 起始值(默认为1)
increment by 间隔数(每次加多少,如果省略,则默认为1)
maxvalue 最大值
minvalue 最小值
nocycle --一直累加,不会循环
nocache ;--不用缓存
首先是nocycle,nocache这两句,no与cycle或者cache之间是不能有空格的。
然后就是间隔数,间隔数>0,则为递增;间隔数<0,则为递减。
有些时候会看见这种写法:
create sequence my_seq2
start with 1
increment by 2
minvalue 1
nomaxvalue
nocycle
nocache;
在语句中出现了nomaxvalue(no与maxvalue之间是不能有空格的),在这个例子中是可以用的。
但是nomaxvalue与nominvalue并不是什么情况下都可以使用的,只有以下两种情况可以使用:
(1)、当间隔数>0时,此时为递增序列,则可以不设置最大值,可以使用nomaxvalue ;
(2)、当间隔数<0时,此时为递减序列,则可以不设置最小值,可以使用nominvalue。
例如:创建序列,从9开始的整数,各个值应该比生成的前一个值小3.允许的最小的可能值为-1,
并且不应该允许它进行循环,这个序列命名为MY_FIRST_SEQUENCE。
在刚开始写这个序列的时候,我是这样写的:
create sequence MY_FIRST_SEQUENCE
start with 9
increment by -3
minvalue -1
nomaxvalue
nocycle
nocache;
这样写是错误的。当时写的时候以为increment就是递增函数,和后面的间隔值得正负无关,但是这样写就是一直报错.
因为此时这已经是一个递减序列了,必须要有一个最大值。此时又想了这样写行不行:
create sequence MY_FIRST_SEQUENCE
start with 9
increment by -3
nominvalue
maxvalue -1
nocycle
nocache;
结果是这样写也不行,但是当这样时是可以的 :create sequence MY_FIRST_SEQUENCE
start with 9
increment by -3
nominvalue
maxvalue 9
nocycle
nocache;
即使maxvalue的值为7,8什么的都不行,会报错:START WITH 不能大于 MAXVALUE
所以此时maxvalue的值必须>=起始值。
所以正确的写法是:
create sequence MY_FIRST_SEQUENCE
start with 9
increment by -3
minvalue -1
maxvalue 9
nocycle
nocache;
和nomaxvalue一样,cycle和cache语句也是存在的:
cycle是当递增到最大值时,会自动跳到最小值继续递增,而nocycle则是递增到最大值时继续递增会报错;递减时同理。
cache定义存放序列的内存块的大小,默认为20。nocache表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。
顺便总结一下的其他用法:
获取序列的下一个值:
select 序列名.nextval from dual;
获取序列的当前值:
select 序列名.currval from dual;
修改序列(修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存)
alter sequence 序列名
increment by ?------>修改间隔值
minvalue ?---------->修改最小值
maxvalue ?---------->修改最大值
nocycle------------->修改为是否循环
nocache------------->修改为是否缓存
;修改序列的一些注意事项:
(1)必须是序列的拥有者或对序列有 ALTER 权限
(2)只有将来的序列值会被改变
(3)改变序列的初始值只能通过删除序列之后重建序列的方法实现
删除序列:
drop sequence 序列名;
删除之后,序列不能再次被引用