1、思考问题
在某张表中,存在一个id列(整数),用户希望在添加记录的时候,该列从1开始,自动的增长,如何处理?
2、介绍
Oracle通过序列处理自动增长列。
(1) 可以为表中的列自动产生值
(2) 由用户创建数据库对象,并可由多个用户共享。
(3) 一般用于主键或唯一列
(4) 序列也是一种数据对象
3、定义序列
² 格式:
Create sequence 序列名
[Start with n1]
[Increment by n2]
[Minvalue n3 | nominvalue]
[Maxvalue n4 | nomaxvalue]
[cache n5 | Nocache]
[Cycle | nocycle]
[order | noorder]
² 参数说明:
l Increment:该子句是可选项,表示序列的增量。一个正数生成一个递增的序列,一个负数生成一个递减的序列。默认值为1。
l Minvalue:可选子句,决定序列生成的最小值。
l Maxvalue:可选子句,决定序列生成的最大值。
l Start:可选子句,指定序列的开始位置,默认情况下,递增序列的起始值为Minvalue,递减序列的起始值为Maxvalue。
l Cache:可选子句,该选项决定是否产生序列号预分配,并存储在内存中。
l Cycle:可选子句,当序列号达到最大或最小值是,可以复位并继续下去。如果达到极限,生成的下一个数据将分别是最小值或者最大值。
l Nocycle:可选子句,序列在达到最大值或最小值后,如果在视图获取下一个值将返回错误。
l Order:该选项可以保证生成序列值是按照顺序产生的。
l Noorder:只保证序列值的唯一性,不保证产生序列值的顺序。
4、删除序列
² 格式:
Drop sequence序列名
5、管理序列
² 格式:
Alter sequence序列名
[Increment by n2]
[Minvalue n3 | nominvalue]
[Maxvalue n4 | nomaxvalue]
[cache n5 | Nocache]
[Cycle | nocycle]
[order | noorder]
说明:除了序列的起始值不能修改外,其他可以设置的序列子句和参数都可以被修改。对序列进行修改后,缓存中的序列值将全部丢失。通过查询数据字典USER_SEQUENCES可以获得序列的信息。
6、案例
1)升序序列
Create sequence myseq
Start with 1 --从1开始
Increment by 1 –每次增加1
Minvalue 1 –最小值为1
Maxvalue 30000 –最大到30000
Cycle –序列到30000后,再重新从1开始
cache 10 --表示一次产生10个号供用户使用,可提高效率,但可能产生跳号。
2)降序序列:
Create sequence myseq
Start with -4 --从1开始
Increment by -1 –每次增加1
Minvalue -5 –最小值为1
Maxvalue -1 –最大到30000;不设最大值用nomaxvalue
Cycle –序列到30000后,再重新从1开始;不循环为nocycle
Nocache
7、序列的使用
Create table test1(id number primarykey, name varchar(32));
Insert into test1values(myseq.nextval,’abc’);
Insert into test1values(myseq.nextval,’ddd);
说明:myseq表示序列名字;nextval为关键字,表示增加序列的值,然后返回该值。
Currval返回序列当前值。
Select myseq.currval from dual;
说明:
(1) 使用序列的情况:
Ø Insert 语句的values中
Ø Insert语句的子查询中 insert into test(id, name) select myseq.nextval, enamefrom emp;
Ø Update的set中
Ø 不包含子查询、snapshot(快照)、view的select语句
(2) Currval总是返回当前sequence的值,但是在第一次nextval初始化之后才能使用currval,否则会出错。一次nextval(无论是select还是update和insert)会增加一次sequence的值,如果在一个语句里面使用多个nextval,其值就是不一样的。
(3) 第一次nextval返回的是初始值;随后的nextval会自动增加定义的incrementby的值,然后返回新值。
(4) 如果指定cache值,oracle就可以预先在内存里面放置一些sequence,这样存取的快些。Cache里面的取完后,oracle自动再取一组到cache。使用cache或许会跳号,比如数据库突然不正常down掉(shutdown/abort),cache中的sequence就会丢失,所以可以在create sequence的时候用nocache防止这种情况。
(5) Maxvalue:即指定升序序列的最大值为10的27次方;降序序列的最大值为-1。NoMaxValue为系统默认值。
(6) Minvalue:升序序列的最小值为1,降序序列最小为负的10的26次方。NoMinValue为默认值。
(7) Cycle:指定当序列即使已经达到序列自增的最大值或最小值时也继续生成整数。当升序序列达到最大值时,下一个生成的值为最小值。当降序序列达到最小值时,下一个生成的值为最大值。以这种规则来循环。