Oracle--使用序列

使用序列
序列(Sequence)是一种用于生成唯一数字的数据库对象。序列生成器(Sequence Generator)会自动生成顺序递增的序列号,从而帮助你提供唯一的主键值。
当需要使用顺序递增的数字时,如果不使用序列,那么需要编写程序生成数字值;通过使用序列,可以简化这种处理操作。
一、建立序列
建立序列是使用CREATE SEQUENCE命令来完成的。为了在当前方案中建立序列,要求用户必须具有CREATE SEQUENCE系统权限;
为了在其他方案中建立序列,要求用户必须具有CREATE ANY SEQUENCE系统权限。
建立序列的语法如下:
CREATE SEQUENCE sequence
    [INCREMENT BY n] [START WITH n]
    [{MAXVALUE n | NOMAXVALUE}][{MINVALUE n | NOMINVALUE}]
    [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];
如上所示,sequence用于指定序列名;INCREMENT BY用于指定序列增量(默认值:1),如果设置n为正整数,则序列号自动递增,反之序列号自动递减;
START WITH用于指定序列生成器生成的第一个序列号,当序列号顺序递增时默认值为序列号的最小值,当序列号顺序递减时默认值为序列号的最大值;
MAXVALUE用于指定序列生成器可以生成的最大序列号(必须大于或等于START WITH,并且必须大于MINVALUE),默认为NOMAXVALUE;
MINVALUE用于指定序列生成器可以生成的最小序列号(必须小于或等于START WITH,并且必须小于MAXVALUE),默认为NOMINVALUE;
CYCLE用于指定在达到序列的最大值或最小值之后是否继续生成序列号,默认为NOCYCLE;CACHE用于指定在内存中可以预分配的序列号个数(默认值:20)。
1.建立序列
当建立序列时,必须为序列提供相应的名称。对于序列的其他选项来说,因为这些选项都有默认值,所以既可以指定,也可以不指定。
CREATE SEQUENCE deptno_seq
START WITH 50 INCREMENT BY 10 MAXVALUE 99 CACHE 10;
当执行了以上语句之后,会建立序列DEPTNO_SEQ。序列DEPTNO_SEQ的第一个序列号为50,序列增量为10,因为指定其最大值为99,所以将来要生成的序列号顺序为50、60、70、80、90。
2.使用序列
当使用序列时,必须通过伪列NEXTVAL用于返回下一个序列值,CURRVAL用于返回当前序列值。
注意,当首次引用序列时,只能用伪列NEXTVAL。当建立了序列之后,如果要使用序列为顺序递增的主键列提供数据,那么可以使用伪列NEXTVAL。
INSERT INTO dept(deptno,dname,loc)
VALUES(deptno_seq.NEXTVAL,'DEVELOPMENT',DEFAULT);
当执行了以上语句之后,会为DEPT表插入一条数据,并且DEPTNO列会使用序列DEPTNO_SEQ所生成的序列号(值:50)。
另外,如果要确定当前序列号,那么可以使用伪列CURRVAL。
SELECT deptno_seq.CURRVAL FROM dual;
3.使用序列的注意事项
    ·通过使用CACHE选项建立序列,可以设置在内存中预分配的序列号个数。该选项设置越大,序列的访问性能会越好,但也会占用更多的内存空间。
    ·当执行rollback语句取消事务操作时,会导致出现序列缺口。
二、维护序列
1.修改序列
当序列值不符合实际需求时,可以执行ALTER SEQUENCE命令修改序列。
注意,序列的初始值不能修改。用户可以直接修改其自身方案的序列,但如果要修改其他方案的序列,
则要求该用户必须具有ALTER ANY SEQUENCE系统权限。语法如下:
ALTER SEQUENCE sequence
    [INCREMENT BY n][MAXVALUE n][MINVALUE n]
    [{CYCLE|NOCYCLE}][{CACHE n|NOCACHE}];
如上所示,sequence用于指定序列名,INCREMENT BY用于改变序列增量,
MAXVALUE用于改变序列生成器可以生成的最大序列号,MINVALUE用于改变序列生成器可以生成点的最小序列号。
CYCLE|NOCYCLE用于改变序列的循环选项,CACHE|NOCACHE用于改变序列的缓存设置。
ALTER SEQUENCE deptno_seq MAXVALUE 200 CACHE 20;
2.删除序列
当序列不再需要时,用户可以执行DROP SEQUENCE命令删除序列。
用户可以直接删除其自身方案的序列,但如果要删除其他方案的序列,那么要求改用户必须具有DROP ANY SEQUENCE系统权限。语法如下:
DROP SEQUENCE deptno_seq;
三、显示序列信息
当建立序列时,Oracle会将序列的信息存放到数据字典。通过查询数据字典视图USER_SEQUENCES,可以显示当前用户所有序列的详细信息。
注意,因为Oracle为该数据字典视图提供了同义词SEQ,所以可以使用SEQ取得序列信息。
SELECT increment_by,cache_size,max_value,last_number
FROM seq WHERE sequence_name='DEPTNO_SEQ';
increment_by用于标识序列增量,cache_size用于标识CACHE选项值,max_value用于标识序列的最大值,
last_number用于标识序列生成器在内存中要生成的下一个值,sequence_name用于标识序列名称。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值