IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Oracle学习笔记——序列

    果冻想发表于 2015-07-15 14:27:55
    love 0

    这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日 于呼和浩特。



沪ICP备19023445号-2号
友情链接