sequence就是序列号,每次取的时候它会自动增加。
1、Create Sequence
CREATE SEQUENCE sequence_test INCREMENT BY 1 -- 每次加的个数 START WITH 1 -- 序列开始的值 NOMAXVALUE -- 表示不设置最大值 NOCYCLE -- 表示一直累加,不循环 CACHE 10;
创建完sequence后,你就可以用CURRVAL,NEXTVAL来获取当前值和下一个值
第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值
CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错
一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的
sequence_test.CURRVAL --返回 sequence的当前值 sequence_test.NEXTVAL --增加sequence的值,然后返回 sequence 值
可以使用sequence的地方:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- INSERT语句的VALUES中
- UPDATE 的 SET中
例子:
INSERT INTO student VALUES (sequence_test.nextval, 'zhangsan', '21',0371); SELECT sequence_test.currval FROM DUAL;
- 如果指定CACHE值,ORACLE会预先在内存里面生成一些sequence,这样存取的速度会更快。
cache里面的取完后,oracle自动再取一组到cache。
使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失。
所以可以在create sequence的时候用nocache防止这种情况。
2、修改sequence
可以alter除start至以外的所有sequence参数。如果想要改变start值,必须 drop sequence 再 re-create。
例子:
ALTER SEQUENCE sequence_test INCREMENT BY 20 MAXVALUE 30000 CYCLE -- 到30000后从头开始 NOCACHE ;
影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。
删除SEQUENCE:
DROP SEQUENCE sequence_test;