果冻想
认真玩技术的地方

Oracle学习笔记——序列

这SQL是啥意思?

每天都在工作,对于刚接触这一块的我来说,自己完全就是一个新人,完全是自己不熟悉的领域。今天又遇到了问题:

SELECT KF.IVR_OPER_MANYIDU_SEQ.nextval sts FROM DUAL;

这句代码啥意思?我在使用MySQl的时候,可没有看到过。后来查了点资料,总算搞明白了。

Oracle中的序列

在这篇MySQL数据库中有一个auto_increment数据类型属性,对这个属性不清楚的伙计,可以先看看。Oracle中的序列和这个auto_increment有点类似,但是Oracle提供的序列的功能比MySQL中的auto_increment的功能强多了。

在Oracle中,使用序列实现字段的自增或自减。序列又叫序列生成器,它用于提供一系列的数字,我们使用序列生成唯一键,每次访问序列,序列按照一定的规律增加或者减少。序列的定义存储在SYSTEM表空间中,序列不像表,它不会占用磁盘空间(尽情的使用吧)。序列独立于事务,每次事务的提交和回滚都不会影响序列。

创建序列

使用CREATE SEQUENCE关键字来创建一个序列,例如:

CREATE SEQUENCE <sequence_name>
   [INCREMENT BY n]
   [START WITH n]
   [{MAXVALUE n | NOMAXVALUE}]
   [{MINVALUE n | NOMINVALUE}]
   [{CYCLE | NOCYCLE}]
   [{CACHE n | NOCACHE}]
   [{ORDER | NOORDER}];
  • INCREMENT BY:用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的;
  • START WITH:指定序列的起始值,默认为1;
  • MAXVALUE n:最大值为n
  • NOMAXVALUE:无最大值
  • MINVALUE n:最小值为n
  • NOMINVALUE:无最小值
  • CYCLE:指定序列到达最大值时,可以循环
  • NOCYCLE:指定序列到达最大值时,不可以循环
  • CACHE n:指定可以缓存多少个值在内存中,缓存的目的是加快对序列的访问
  • NOCACHE:不缓存序列
  • ORDER:按照请求的顺序产生序列
  • NOORDER:不按照请求的顺序产生序列

下面就给大家看一个我们生产服务器上的序列对象吧。使用下列语句查询序列的创建语句:

SELECT DBMS_METADATA.GET_DDL('SEQUENCE', u.object_name) FROM  user_objects u WHERE object_type = 'SEQUENCE';

以下是我们生产库上的一个序列:

CREATE SEQUENCE  "KF"."YJKF_TRANS_SWITCH_SEQ"  
MINVALUE 1 
MAXVALUE 999999999999999999999999999 
INCREMENT BY 1 
START WITH 1 
CACHE 20 
NOORDER  
NOCYCLE 

在本地测试库创建一个序列:

CREATE SEQUENCE  "JELLY"."TEST_SEQ"  
MINVALUE 1 
MAXVALUE 9999999999999999999999999999 
INCREMENT BY 1 
START WITH 1 
CACHE 10 
NOORDER  
NOCYCLE

当指定NOMAXVALUE时,最大值就是9999999999999999999999999999。当创建好序列以后,我们可以使用ALTER语句修改序列:

ALTER SEQUENCE <sequence_name>
   [INCREMENT BY n]
   [START WITH n]
   [{MAXVALUE n | NOMAXVALUE}]
   [{MINVALUE n | NOMINVALUE}]
   [{CYCLE | NOCYCLE}]
   [{CACHE n | NOCACHE}]
   [{ORDER | NOORDER}];

序列的使用

由于使用序列生成的值是唯一的,我们一般都使用序列作为主键,当我们向表中插入一条数据时,就需要得到一个新的序列值,使用以下语句就能得到一条新的语句值:

SELECT test_seq.nextval FROM dual;

如果我们想查看当前的序列值,可以使用以下的语句:

SELECT test_seq.currval FROM dual;

每执行一次SELECT test_seq.nextval FROM dual;语句,对应的序列值都会进行对应的增加。

每个会话执行currval之前,必须先执行nextval,否则就会产生错误。

当我们插入数据时,可以这样利用序列来当做主键值,进行插入:

INSERT INTO tb_student VALUES(student_id_seq.nextval, 'Kite', '男', 22);

删除序列

当我们想把序列的值重新设置为起始值1时,你会发现,你根本没法办到。当你想使用ALTER去修改序列的时候,会提示不允许修改START WITH。那如果想把序列的值重新设置为起始值,怎么办?

没有更好的办法,只能使用以下的语句,把序列干掉,再重新建一个:

DROP SEQUENCE test_seq;

是的,我说过,没有更好的办法。只要你愿意,你可以干掉序列。

2015年6月2日 于呼和浩特。

赞(33) 打赏
未经允许不得转载:果冻想 » Oracle学习笔记——序列
关注微信公众号
关注微信公众号和果冻一起分享你的疑惑与心得。
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

玩技术,我们是认真的

联系我们关于果冻

请我喝杯咖啡也是不错的

支付宝扫一扫打赏

微信扫一扫打赏