序列Sequence

序列Sequence

1 序列Sequence

序列:

  • 自动提供唯一的数值
  • 共享对象
  • 主要用于提供主键值
  • 可代替应用程序生成序号
  • 将序列值缓存到内存中,可以提高访问效率

数据库对象:存放在数据库当中的

可共享:相同的用户,不用的会话登录,可以共同调用;不同用户可以使用

主键列,如果是 number 型的,按顺序产生,可以使用序列

应用程序自己产生唯一的数字也可以,需要额外的代码,维护不方便,使用效率不高

 

创建序列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;

 

nextvalcurrval伪列

  • 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,再次插入序列值时会一直增长,序列值不再连续

 

user_sequences

  • 将序列值缓存在内存中,使得这些值访问起来更快
  • 如果发生下列情况,可能使得一个表中的序列值之间产生间隔,而不是连续的:
    •   回滚操作产生
    •   系统崩溃
    •   序列值同时也用于其它表
  • 如果一个序列是以NOCACHE选项建立的,那么可以通过查询USER_SEQUENCES表来查看下一个可用的序列值,而不会使序列的当前值增加

【注意】如果使用cache,关闭数据库时,所有已生成并缓存,但还没有发出的数值会丢失

desc user_sequences;
col SEQUENCE_NAME for a20
select * from user_sequences;

 

修改序列

如果使用序列超过设置最大值,需要修改序列

select dept_deptno.nextval from dual;

alter sequence dept_deptno
    increment by 1
    maxvalue 999999
    nocache
    nocycle;

select * from user_sequences;

 

删除序列

语法:drop sequence sequence_name;

drop sequence dept_deptno;

posted @ 2021-05-17 16:11  chchcharlie、  阅读(332)  评论(0编辑  收藏  举报