• 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"
  • 相关阅读:
    POJ 1887 Testing the CATCHER
    HDU 3374 String Problem
    HDU 2609 How many
    POJ 1509 Glass Beads
    POJ 1458 Common Subsequence
    POJ 1159 Palindrome
    POJ 1056 IMMEDIATE DECODABILITY
    POJ 3080 Blue Jeans
    POJ 1200 Crazy Search
    软件体系结构的艺术阅读笔记1
  • 原文地址:https://www.cnblogs.com/springsnow/p/11547425.html
走看看 - 开发者的网上家园