序列
序列是数据库对象,独立于表存储,可以为多个表使用
序列最主要的用途就是创建一个主键的值
序列能确保这个主键的唯一性
创建序列
语法
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n| NOMAXVALUE}]
[{MINVALUE n| NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n| NOCACHE}];
格式说明:
sequence:序列的名字
INCREMENT BY n:序列号之间的间隔(又称步长),n是一个整数,默认为1,如果该值为负值,该序列为降序序列
START WITH n:第一个序列数 ,n默认为1
MAXVALUE n:序列最大值,如果序列达到最大值,且不是继续循环产生序列值,则会提示序列超过最大值,序列最小值与此类似
NOMAXVALUE:无最大值,默认对于升序序列,最大值为10^27,降序序列为-1
MINVALUE n:序列最小值
NOMINVALUE:无最小值,默认对于升序序列,最小值为1,降序序列为-10^26
CYCLE|NOCYCLE:序列在到达它的最大或最小值之后,是否继续循环产生,默认是不循环产生
CACHE n| NOCACHE:指定Oracle数据库预先分配多少值保持在内存中,默认为20个值。在内存中缓冲序列可以提高对序列的存取速度,在第一次使用到序列时,一定数量的序列值被存入缓存,之后针对下一个序列值的请求可以直接从缓存中获取,提高性能。
–对于降序,最大值为-1,初始值不可以大于-1
–同样,升序对应为1
创建序列
create sequence seq_bookid
start with 1 --默认 1
increment by 10 --默认 1
maxvalue 99999999 --默认 10的27次方
cycle -- nocycle 默认 当达到最大值后是否循环生成序列号
cache 20 -- nocache 缓存,提前缓存20个,默认为cache 20
序列的使用
nextval --生成下一个序列号
currval --取出当前序列号
通过NEXTVAL和CURRVAL这两个伪列,将序列应用到表中,NEXTVAL伪列返回下一个可用的序列值,可以通过“序列名.NEXTVAL”引用这个值,此时一个新的序列值被产生并存到CURRVAL中
CURRVAL伪列获得当前的序列值,NEXTVAL必须在CURRVAL引用前,需要通过“序列名.CURRVAL”引用这个值
–向表中插入数据
create table tb_book(
bookid number(6) primary key,
bookname varchar2(32) not null,
author varchar2(32) not null
)
insert into tb_book values(seq_bookid.nextval,'java高级教程1','java');
insert into tb_book values(seq_bookid.nextval,'java高级教程2','java');
insert into tb_book values(seq_bookid.nextval,'java高级教程3','java');
select seq_bookid.nextval from dual
select seq_bookid.currval from dual
delete from tb_book where bookid = 140;
–序列只会递增或递减,不会回退,将140使用后,seq_bookid.nextval只会递增或递减,不会回退。
修改序列
修改序列使用ALTER,且START WITH选项不可以修改
语法形式
ALTER SEQUENCE sequence
[INCREMENT BY n]
[{MAXVALUE n| NOMAXVALUE}]
[{MINVALUE n| NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n| NOCACHE}];
使用ALTER SEQUENCE修改序列,只有以后的序列值会受到影响,之前的不受影响
修改序列的部分选项不能使原有序列产生错误,例如不能将序列的最大值修改为小于当前的序列值
删除序列
DROP SEQUENCE sequence