首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Oracle 19C入门到精通之序列对象

序列是Oracle提供的用于生成一系列唯一数字的数据库对象。序列会自动生成顺序递增的序列号,以实现自动提供唯一的主键值。序列可以在多用户并发环境中使用,并且可以为所有用户生成不重复的顺序数字,而不需要任何额外的I/O开销。

1. 创建序列

序列与视图一样,并不占用实际的存储空间,只是在数据字典中保存它的定义信息。如果用户在自己的模式中创建序列,则必须具有CREATE SEQUENCE系统权限;如果用户要在其他模式中创建序列,则必须具有CREATE SEQUENCE系统权限和其他模式中的CREATE权限。

使用CREATE SEQUENCE语句创建序列的语法格式如下:

CREATE SEQUENCE 

[START WITH n]

[INCREMENT BY n]

[MINVALUE n | NOMAINVALUE]

[MAXVALUE n | NOMAXVALUE]

[CACHE n | NOCYCLE]

[CYCLE | NOCYCLE]

[ORDER | NOORDER];

seq_name:创建的序列名。

INCREMENT:该子句是可选的,表示序列的增量。一个正数将生成一个递增的序列,而一个负数将生成一个递减的序列。默认值是1。

MINVALUE:可选的子句,决定序列生成的最小值。

MAXVALUE:可选的子句,决定序列生成的最大值。

START:可选的子句,指定序列的开始位置。默认情况下,递增序列的起始值为MINVALUE,递减序列的起始值为MAXVALUE。

CACHE:该选项决定是否产生序列号预分配,并存储在内存中。

CYCLE:可选的关键字,当序列达到最大值或者最小值时,可以复位并继续下去。如果达到极限,则生成的下一个数据将分别是最小值或者最大值。如果使用NOCYCLE选项,那么在序列达到了其最大值或最小值之后,当再试图获取下一个值时,将返回一个错误。

ORDER:该选项可以保证生成的序列值是按照顺序产生的。例如,ORDER可以保证第一个请求得到的数为1,第二个请求得到的数为2,以此类推;而NOORDER只保证序列值的唯一性,不保证产生序列值的顺序。

建立序列时,必须为序列提供相应的名称。对于序列的其他子句而言,因为这些子句都具有默认值,所以既可以指定,也可以不指定。

--在scott模式下,创建一个序列empno_seq

create sequence empno_seq maxvalue 99999 start with 9000 increment by 100 cache 50;

上述代码创建的序列empno_seq,第一个序列号为9000,序列增量为100,因为指定其起始值为9000,所以将来生成的序列号为9100、9200、9300……,可生成的最大值是99999。

使用序列时,需要用到序列的NEXTVAL和CURRVAL两个伪列。其中,NEXTVAL将返回序列生成的下一个序列号,而伪序列CURRVAL则会返回序列的当前序列号。首次引用序列时,必须使用伪列NEXTVAL

--在scott模式下,使用序列empno_seq为emp表的新记录提供员工编号

insert into emp(empno,ename,deptno) values(empno_seq.nextval,'北方',10);

执行上述语句后,会为emp表插入一条数据,并且empno列会使用序列empno_seq生成的序列号。另外,如果用户确定当前序列号,则可以使用伪列CURRVAL;

--使用伪列CURRVAL查询当前的序列号

select empno_seq.currval from dual;

实际上,在为表生成主键值时,通常是先为表创建一个行级触发器,然后在触发器主体中使用序列值替换用户提供的值。

2. 管理序列

用ALTER SEQUENCE语句可以对序列进行修改。需要注意的是,除了序列的起始值START WITH不能被修改,其他可以设置序列的任何子句和参数都可以被修改。如果要修改序列的起始值,则必须先删除序列,然后重建该序列。

在scott模式下,修改序列empno_seq的最大值为100000,序列增量为200,缓存值为100,代码如下:

alter sequence empno_seq maxvalue 100000 increment by 200 cache 100;

对序列进行修改后,缓存中的序列值将全部丢失。通过查询数据字典user_sequences可以获得序列的信息。

select * from user_sequences

当序列不再被需要时,数据库用户可以执行DROP SEQUENCE语句删除序列。

--删除empno_seq序列

drop sequence empno_seq;

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OGYpCLjrtvABip9HHBTB3eNA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券