1.为啥要用序列:
序列可以自动生成递增或递减的不重复的数字.所以用它来做表的主键是一个高效的方法.不然手动去为每一行生成一个主键可是个麻烦的事
2.创建序列:
语法:
CREATE SEQUENCE [schema.]sequence_name
[START WITH i][ INCREMENT BY j]
[MAXVALUE m | NOMAXVALUE] [MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE] [CACHE p | NOCACHE]
每个参数意义:
i表示序列的第一个值.
j为正数表示递增,为负数表示递减.j的大小表示每两序列的值相差为几.
m表示序列可生成的最大值.n表示最小值.注意i与n的区别.假设最小值n为1.则i就可为大于或等于n小于或等于m的任意整数.
如果啥参数都不指定,比如:CREATE SEQUENCE default.
则i默认为1. j默认为1.没有最大值最小值.nocycle.p为20
CYCLE:
假如我们指定NOCYCLE,最小值为10,最大值为12,增距为1的序列.连续使用3次后就会出错了.提示说超过最大值了.如果指定
CYCLE则会连续产生10,11,13,10,11,13....
CACHE P:
p的值表示预取多少个序列值在内存中,提高获取效率.比如p取10的话内存中会生成10个序列号在那.如果你只用了5个.然后突然Oracle服务器关了.
这样就会掉失5个序列号.理论上应该是这样,不过我还没试过啊.
如果不选CYCLE的话p可取大于0的任何整数.但如果选了CYCLE则系统会计算一个循环内共会产生多少个序列号设为n,p的值必须小于n.
例如:CREATE SEQUENCE emp_seq START WITH 10 INCREMENT BY1 MAXVALUE 15 CYCLE CACHE 6;则会出错p必须是小于6的数
这样设计的目的可能是为了节约内存,最多只能生成6个序列号,如果占用大于容纳6个序列号的内存就是浪费.但在用nocycle时没做这样的检查,不知道为啥.
3使用序列
CREATE SEQUENCE emp_seq START WITH 10 INCREMENT BY 1;
序列中有两个伪列nextval,currval.使用一次nextval则生成一个新的序列号.currval则用来查看目前生成的序列号是多少.
注意刚新建一个序列后还不能用currval,因为当前还没有序列号.必须至少使用一次nextval后再使用.
使用序列主要就是使用nextval.另外序列也是一个独立的对象.许多表可以共用一个序列.不过这样在一个表中生成的序列号就不连续.
INSERT INTO emp(ename,empno) VALUES(emp_seq.nextval,'one');--插入10,'one'
INSERT INTO emp(ename,empno) VALUES(emp_seq.nextval,'two');--插入11,'two'
4.修改序列
除了起始值不能改,其他值都能改.比如修改上一个序列
ALTER SEQUENCE emp_seq INCREMENT BY 10;
修改后它会以之前的序列号11为起点,增加10就是了.对之前生产的序列号不会有影响
INSERT INTO emp(ename,empno) VALUES(emp_seq.nextavl,'three');--插入21,'three'
INSERT INTO emp(ename,empno) VALUES(emp_seq.nextavl,'four');--插入31,'four'
删除序列:
DROP SEQUENCE emp_seq;