SEQUENCE
序列:可供多个用户来产生唯一数值的数据库对象
- 自动提供值
- 共享对象
- 主要用于提供主键值
- 将序列装入内存可以提高访问效率
创建序列
create sequence 序列名
increment by n 每次增长 n
start with n 从 n 开始
maxvalue n | nomaxvalue 最大值
minvalue n | nominvalue 最小值
cycle | no cycle 是否要循环
cache n | no cache 是否缓存
create sequence seq_test
start with 100
increment by 5
maxvalue 120
cycle
cache 10
sequence的两个伪列,nextval,currval
select seq_test.nextval from dual
序列的下一个值
select seq_test.currval from dual
序列的当前值
注意:
- 第一次调用nextval返回的是初始值,随后的nxetval会自增定义的increment的值。currval是返回当前sequence的值,在调用序列的currval时,在之前一定要有过nextval,否则出错。就是当新创建一个序列时不能一开始就调用currval,一定要先有第一次nextval后才可以。
- 如果指定cache值,oracle就会在内存里放置一些sequence,这样存取的快些。cache里的取完了,oracle自动再取一组到cache。使用cache可能会跳号,如数据库突然不正常down掉,cache中的sequence就会丢失,所以在创建sequence时用no cache防止这种情况。
序列裂缝
序列在以下情况出现裂缝
- 回滚 (当sql语句出错时也算)
- 系统异常
- 多个表同时使用同一个序列
例:seq_test.currval 为 100,increment by 10,而且执行sql:insert into test1 values(seq_test.nextval,’z’ )都会因为约束而报错,产生回滚。
执行sql次数 | seq_test.currval |
---|---|
1 | 110 |
2 | 120 |
3 | 130 |
修改序列
不能修改序列的start with,其他的都可以
alter sequence 序列名
increment by x …..
删除序列
drop sequence 序列名