序列

本文详细介绍了Oracle数据库中序列对象的创建、使用和修改,包括序列的属性设置如步进值、起始值、最大值和缓存等。序列在多用户并发环境下可能出现的问题,如序列重复和用户等待,以及如何通过独立的序列对象避免这些问题。此外,还阐述了NEXTVAL和CURRVAL伪列的使用规则,以及在哪些场景下不能使用序列。最后,提到了序列的修改限制和删除操作,并提供了查询序列信息的SQL语句。
摘要由CSDN通过智能技术生成

在数据库中,很多地方需要一个唯一编号,就和人的身份证号差不多。有二种方法,序列对象和PL/SQL子程序实现。这回遇到锁定和多用户并发的问题,很容易导致序列重复,或者是用户的等待。使用一个独立的序列对象就不会有这样的问题。序列与使用序列的分钟方案对象如下图所示
在这里插入图片描述
一、创建自增序列
序列独立于失误的提交或回滚,因此当用户使用序列并回滚了事务之后,可能会导致序列号具有间隙。考虑到应用程序可能需要没有间隙的数字的话,则不能使用Oracle的序列,必须在数据库中使用自己开发的代码来序列化程序的行为。
在定义一个序列时,需要如下所示的常规信息:
1、序列的名称。
2、序列时升序还是降序。
3、数据库是否要在内存中缓存生成的序列号的集合。
4、当序列超出最大值时是否要重复使用序列。
序列独立于表存在,因此一个序列可以作用于多个表。

CREATE SEQUENCE sequence			--指定序列的名称
[ INCREMENT BY n ]					--步进值
[ START WITH n ]					--起始值
[ {MAXVALUE n | NOMAXVALUE} ]		--最大值
[ {MINVALUE n | NOMINVALUE} ]		--最小值
[ {CYCLE | NOCYCLE } ]				--是否使用循环
[ {CACHE  n | NOCACHE} ];			--是否缓存

INCREMENT BY 默认值 1 ,
START WITH默认值 1 ,
MAXVALUE ,系统能产生的最大值时10的27次,递减最大值时-1,
MINVALUE ,系统能产生的最小值时10的26次, 最小值 1,
CACHE(缓存) ,定义存放序列的内存块大小,默认为20。 NOCACHE表示不对序列进行内存缓存。对序列进行缓存,可以改善序列的性能。
二、NEXTVAL和CURRVAL伪列
创建好序列之后,要引用序列中递增的值,需要使用Oracle的伪列。伪列的行为和表列的行为比较相似,但是并没有实际存储到表中。对序列来说,通常使用NEXTVAL和CURRVAL伪列获取其序列的值。
NEXTVAL,获取当前序列的下一个序列的值。
CURRVAL,当NEXTVAL获取到下一个值后,CURRVAL的当前值就指向CURRVAL
使用语法如下(大写字母)
序列名.NEXTVAL
序列名.CURRVAL
序列通常使用NEXTVAL获取到序列的初始值,后续调用NEXTVAL时会按照序列定义的步进值进行递增,在使用NEXTVAL获取序列的初始值之后,才能使用CURRVAL返回序列的当前值,这个值是有NECTVA计算返回的。直接使用CURRVAL 会报错 > ORA-08002: sequence YEWUBH.CURRVAL is not yet defined in this session 。

在一些地方不能使用序列,会导致Oracle抛出异常,不能使用序列的场合如下:
1、查询视图时的SELECT列表。
2、具有DISTINCT关键字的SELECT语句。
3、具有GROUP BY、HAVING 或 ORDER BY 字句的SELECT 语句。
4、位于SELECT、DELETE 或UPDATE 语句的字句。
5、在CREATE TABLE 或 ALTER TABLE语句的DEFAULT。
三、修改序列

ALTER SEQUENCE sequence				--指定序列的名称
[ INCREMENT BY n ]					--步进值
[ START WITH n ]					--起始值
[ {MAXVALUE n | NOMAXVALUE} ]		--最大值
[ {MINVALUE n | NOMINVALUE} ]		--最小值
[ {CYCLE | NOCYCLE } ]				--是否使用循环
[ {CACHE  n | NOCACHE} ];			--是否缓存

注意:
1、为了使用不同的数值重新开始一个序列,必须移除并且重寻创建该序列。
2、吐过更改了INCREMENT BY 值,也就是步进值,在首次调用NEXTVAL之前,一些序列数值将被跳过,因此如果向保留原来的START WITH 的值,必须移除并且使用原来的START WITH 和新的INCREMENT BY 值重新创建序列。
3、Oracle数据库会完成一些验证,比如一个新的MAXVALUE 的值就不能小于当前的序列值。
修改序列的限制:
1、不能修改序列的起始值,如果要对起始值进行变更,只能删除当前序列,在常见一个同名的序列。
2、序列的最小值不能小于序列的当前值,否则会导致序列出现异常。
3、序列的最大值不能小于序列的当前值,很明显,否则会造成重复值的出现。
4、要确保修改后的序列规则不影响以前的序列值,只有未来的序列值会受到影响。
5、要修改序列用户必须拥有ALTER SEQUENCE。

四、删除序列

DROP SEQUENCE [ schema. ] sequence_name	;

五、查看序列
创建好序列后,可以在all_sequences、user_sequences 和 dba_sequences查询到新创建的数据字典及其详细信息。

--所有序列
SELECT * FROM all_sequences;

--当前用户序列
SELECT * FROM user_sequences;

--数据库所有序列
SELECT * FROM dba_sequences;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值