Oracle中的小序列
话说序列很少人知道,因为Mysql和sql server都有自动增长字段(如ID主键自动增长的整数),而Oracle却没有提供该用法,那么Oracle提供了更加灵活方便的策略-建立对象序列。
序列创建之后也是真真实实存在的,存在我们的磁盘上,并可以适用场合调用,序列总是从指定的长度开始,创建了之后可以按照指定步长进行累加,获得新的整数
格式:
create sequence emp_seq
解释:
创建一个序列,经常会用后缀seq来识别的
格式:
select object_name,object_type,status from user_objects where lower(object_name)='emp_seq';
解释:
竟然是正儿八经存在的对象,那么我们就可以通过数据库user_objects.
格式:
select sequence_name,min_value,max_value,increment_by from user_sequences where lower(sequence_name)='emp_seq';
解释:
用来查看我们创建的序列详细信息的,我们通过这个突然发现,还能看最大值,最小值,每次增长的步长.
使用序列
创建不用等于白创,那么使用前先要理解两个值,第一个currval,第二个nextval,从英语意思来看也很清晰,currval获取当前值,nextval获取下一个值,每次调用nextval都会使当前的序列增加单位步长(默认是1)
调用序列这两个属性方法为seq.currval和seq.nextval,第一次使用序列,注意哈,要先调用next的属性,否则会报错的!
格式:
select emp_seq.nextval from dual;
解释:
我们用虚表dual来作为seq.nextval的from源,单行输出显示,这时候结果会是1.
因为nextval的值是默认整张的,所以我们要保证表ID为主键
格式:
alter table student_name modify(id number primary key);
格式:
insert into student(id,name) values(emp_seq,'你好',);
解释:
假如student表中已有数据,我们插入id时候直接调用创建的序列你会惊奇的发现,失败!!!怎么回事,我们用select emp_seq.currval from dual;--发现数据是2,表中已经有2了当然不行了,怎么办也不可能把原有的数据(这一列删除掉),数据量小还可以用用,麻烦不说,显示不出序列的威力!下面我们介绍怎么设置初始值,加入本表id值已经1000条数据,我们让他从1000开始默认自增不是更好更高效!
格式:
drop sequence emp_seq;--删除原来的序列
create sequence emp_seq start with 1001;
解释:
关键词start with 英语单词理解就是起始,那么意思就是说这个序列从1001开始自动增加(默认是1),插入的时候起始值是1001这样就可以根据我们的需求来使用序列,是不是很方便简单高效。
格式:
alter sequence emp_seq minvalue 8888;--修改最小值,注意当前修改的最小值不能大于原表中的数值(1001)!!
alter sequence emp_seq maxvalue 9999;--修改最大只
格式:
alter sequence emp_seq increment by 5;
解释:
这就是我们前面一直给大家提到的默认增长的步调,就是说每一次插入id值默认自动增长多少。
这个地方要注意设置最大值的问题,如果我最大值是20的话,从1开始每次增加5,最大只能到17,第四次就会超出最大值报错,这个的话大家一下就会明白。
那么当我超出最大值就不可以,超出最大值就让他变成最小值,重新循环,可以的,我们是操控者,只要我们愿意,他就得可以,下面介绍一个关键字来替我们去执行这个操作。
格式:
create sequence emp_seq
start with 5
minvalue 1
maxvalue 30
incremenet by 1
/--创建结束
这时候我们算是吧前面学的参数都用上了,看一看其实也很简单啊,么点难度,我们开始多次nextval属性值,直到用currval看当前值最大值为30,当我们在使用nextval的时候就会神奇的发现变成了1.
格式:
alter sequence emp_seq cycle;--开启
alter sequence emp_sql nocycle;--关闭
缓存,什么是缓存,缓存是更好的读数据,速度比内存都要快很多,那么序列也有缓存,大量数据能有缓存效果对于数据库整体来说无疑是一个性能极大的提升。
那么序列的cache,每次利用nextval,并非直接操作,而一次性获取多个列表的缓存,从缓存中抓取数值,而且依赖于currval和步长increment.
定义存放序列的内存块的大小,预先生成序列号,存放在内存块当中,用下一个序号给予快速的相应,可以更快的响应,当一组用完之后会再生成一组,这样可以提高生成序列号的效率,默认值20。
格式:
alter sequence emp_seq cache 10;
解释:
设置缓存区大小
昨天在工作中,在表中添加了一个序列id,当时数据量比较小,利用表格然后插入到数据表列,如果数据量这个方法不可行而且特别麻烦,那么今天学习的序列就派上了大用场!
小序列并不简单,能用好、用到正地方确实要很大学问,希望大家一起学以致用多多实战。