sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者其他.
1、创建序列 Create Sequence
你首先要有create sequence或者create any sequence 权限
create sequence cux_demo_sequence minvalue 1 maxvalue 99999999999 start with 10000 increment by 1 nocycle cache 20 order ;
注释:
minvalue 1 --最小值
maxvalue 99999999999 --最大值
start with 10000 --起始数值
increment by 1 --每次增加1
nocycle --一直累加不循环
cache 20 --缓存
order ;
还有一些其他参数,比如:
nomaxvalue --无最大值
nocache --不设置缓存
如果指定cache值,oracle就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。
2、使用序列
定义好sequence,你就可以用currval,nextval
currval=返回 sequence的当前值
nextval=增加sequence的值,然后返回 sequence 值
示例:
cux_demo_sequence.currval cux_demo_sequence.nextval
可以使用sequence的地方:
不包含子查询、snapshot、view的 select 语句
insert语句的子查询中
insert语句的values中
update 的 set中
可以看如下例子:
insert into cux_demo_table values (cux_demo_sequence.nextval, 123 , 'ibad' , 'mark' ,'y'); select cux_demo_sequence.currval from dual;
注意:
第一次nextval返回的是初始值;随后的nextval会自动增加你定义的incrementby值,然后返回增加后的值。currval 总是返回当前sequence的值,但是在第一次nextval初始化之后才能使用currval,否则会出错。一次nextval会增加一次sequence的值,所以如果你在同一个语句里面使用多个nextval,其值就是不一样的。
3、修改序列 alter sequence
你或者是该sequence的owner,或者有alter any sequence 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 重新创建sequence .
alter sequence alter sequence cux_demo_sequence increment by 10 maxvalue 10000 cycle -- 到10000后从头开始 nocache ;
影响sequence的初始化参数:
sequence_cache_entries =设置能同时被cache的sequence数目。
4、删除序列 drop sequence
可以很简单的drop sequence
drop sequence cux_demo_sequence;