序列Sequence
序列Sequence
1 序列Sequence
序列:
- 自动提供唯一的数值
- 共享对象
- 主要用于提供主键值
- 可代替应用程序生成序号
- 将序列值缓存到内存中,可以提高访问效率
数据库对象:存放在数据库当中的
可共享:相同的用户,不用的会话登录,可以共同调用;不同用户可以使用
主键列,如果是 number 型的,按顺序产生,可以使用序列
应用程序自己产生唯一的数字也可以,需要额外的代码,维护不方便,使用效率不高
2 创建序列create sequence
increment by n:步长,每次增长多少,默认 1
start with n:初始值,默认 1
maxvalue:升序序列最大值,默认无最大值
minvalue:降序序列最小值,默认无最小值
cycle:到最大值之后,是循环。cycle不能用在主键列。默认nocycle循环后初始是从1开始的,不管原来的值是如何设的
cache :缓存多少,默认20。为了提高性能,oracle预先成批地发出序列值,并将它们缓存起来以便发给用户
create sequence dept_deptno
increment by 1
start with 91
maxvalue 100
nocache
nocycle;
3 nextval和currval伪列
- NEXTVAL返回下一个可用的序列值。它返回一个唯一的值每次引用它的时候,任何用户都可以引用它
- CURRVA工得到当前的序列值
- 使用CURRVAL之前必须发出NEXTVAL
伪列:不存在的,虚拟的列
第一次访问时,currval是没有值的(【注意】在调用currval的值前,必须先调用nextval的值)
select dept_deptno.currval from dual;
初始化序列的当前值:
select dept_deptno.nextval from dual;
4 序列的使用
利用序列产生的值向表中插入数据
insert into dept(deptno,dname,loc) values(dept_deptno.nextval,'MARKETING','BEIJING');
select * from dept;
【说明】:rollback 操作不会使序列值rollback,再次插入序列值时会一直增长,序列值不再连续
5 user_sequences
- 将序列值缓存在内存中,使得这些值访问起来更快
- 如果发生下列情况,可能使得一个表中的序列值之间产生间隔,而不是连续的:
- 回滚操作产生
- 系统崩溃
- 序列值同时也用于其它表
- 如果一个序列是以NOCACHE选项建立的,那么可以通过查询USER_SEQUENCES表来查看下一个可用的序列值,而不会使序列的当前值增加
【注意】:如果使用cache,关闭数据库时,所有已生成并缓存,但还没有发出的数值会丢失
desc user_sequences;
col SEQUENCE_NAME for a20
select * from user_sequences;
6 修改序列
如果使用序列超过设置最大值,需要修改序列
select dept_deptno.nextval from dual;
alter sequence dept_deptno
increment by 1
maxvalue 999999
nocache
nocycle;
select * from user_sequences;
7 删除序列
语法:drop sequence sequence_name;
drop sequence dept_deptno;