序列(sequence)

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值