zoukankan      html  css  js  c++  java
  • Oracle(00):序列SEQUENCE

    一、序列介绍

    Oracle的序列是一种数据库对象,主要作用是用来产生唯一值。序列被创建以后可以通过数据字典找到序列对象,因此序列可以被多个对象共享。

    二、创建序列

    序列使用CREATE SEQUENCE语法进行创建:

    CREATE SEQUENCE sequence 
    [INCREMENT BY n]
     [START WITH n]
     [{MAXVALUE n | NOMAXVALUE}]
     [{MINVALUE n | NOMINVALUE}]
     [{CYCLE | NOCYCLE}]
     [{CACHE n | NOCACHE}];
    • NCREMENT BY:用于定义序列的步长,如果省略,则默认为1,如果是负值,则代表序列的值是递减的。
    • START WITH:定义序列的初始值(即产生的第一个值),默认为1。
    • MAXVALUE:定义序列能生成的最大值。NOMAXVALUE是默认选项,代表没有最大值,这时,对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。
    • MINVALUE:定义序列能生成的最小值。NOMINVALUE是默认选项,代表没有最小值,这时,对于递减序列,系统能够产生的最小值是负的10的26次方;对于递减序列,最小值是1。
    • CYCLE和NOCYCLE:表示当序列生成器的值达到限制后是否循环。如果循环,当递增序列达到最大值时,循环到最小值;对于递减序列,达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。
    • CACHE:定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。

    例如:

    CREATE SEQUENCE invoice_seq
    INCREMENT BY 1
    START WITH 1
    MAXVALUE 9999999
    NOCYCLE NOCACHE;

    三、查询序列

    一旦序列被创建,序列的创建代码就被文本化在数据字典中,可以在user_objects数据字典中看到,如:

    SELECT object_name,object_id,object_type  FROM user_objects WHERE object_name = 'INVOICE_SEQ';
    在user_sequences表中保存了序列明细信息:

    SELECT sequence_name, min_value, max_value, increment_by, last_number  FROM user_sequences;

    四、使用序列

    NEXTVAL和CURRVAL伪列

    • NEXTVAL:返回下一个可用的序列值,它每次返回一个唯一的被引用值,实际对不同的用户也是如此。当使用sequence.NEXTVAL时,一个新的序列数被产生并且当前的序列数被放入CURRVAL。
    • CURRVAL:获得当前的序列值。在首次使用NEXTVAL之前就使用CURRVAL的话,会报错。

    使用如下 :

    SELECT invoice_seq.CURRVAL,invoice_seq.NEXTVAL FROM DUAL;
    
    INSERT INTO invoice  (invoice_id, vendor_id, invoice_number, invoice_total  )
          VALUES (invoice_seq.NEXTVAL, 10, 'INV' || invoice_seq.CURRVAL, 100  );

    可以在下面的上下文中使用NEXTVAL和CURRVAL:

    • 不是子查询的一部分的SELECT语句的字段列表。
    • INSERT语句中子查询的SELECT列表。
    • INSERT语句中的VALUES子句。
    • UPDATE语句中的SET子句。

    不能再以下的上下文中使用NEXTVAL和CURRVAL:

    • 视图的SELECT列表。
    • 带DISTINCT的SELECT语句。
    • 带GROUP BY、HAVING或ORDER BY子句的SELECT语句。
    • 在SELECT、DELETE或UPDATE语句中的子句。
    • 在CREATE TABLE或ALTER TABLE语句中的DEFAULT表达式。

    另外要注意,ROLLBACK并不能使序列值回滚。

    五、修改序列

    如:

    ALTER SEQUENCE invoice_seq     INCREMENT BY 2 MAXVALUE 10   NOCACHE  NOCYCLE;

    修改序列时,有如下几个限制:

    • 不能该表序列的起始值。
    • 最小值不能大于当前值。
    • 最大值不能小于当前值。
    • 修改后的序列规则不会影响以前的序列值,只有未来的序列值会受到影响。
    • 用户必须具有ALTER SEQUENCE的权限。

    六、删除序列

    DROP SEQUENCE invoice_seq;

    七、创建自增序列

    1、创建一个序列

    create sequence sq_recid 
    minvalue 1 maxvalue 999999  increment by 1   start with 1 noCYCLE;

    2、创建一个触发器

    create or replace trigger  trg_test
      before  insert on test for each row
    begin
      select sq_recid.nextval into :new.ID from dual;
    end;
    
    alter  trigger trg_test  enable;

    3、在C#中也可以手工插入序列到表中

    string sql="insert into test(ID,otherCol)value (Sql_recid.nextval,***)
        retuing ID into :ID"
  • 相关阅读:
    1-1-LVS负载均衡
    linux的软链接和硬连接的区别
    linux的目录结构及配置文件
    C6和C7对比
    1-6 RAID级别介绍
    Animation动画(一)
    Android中的BroadCast静态注册与动态注册
    Android中Action
    隐式Intent
    Volley框架使用(POST)
  • 原文地址:https://www.cnblogs.com/springsnow/p/11547425.html
Copyright © 2011-2022 走看看