ITPub博客

首页 > 数据库 > Oracle > ORACLE序列的使用

ORACLE序列的使用

原创 Oracle 作者:q499311546 时间:2017-06-26 16:15:24 0 删除 编辑
在创建数据库表时,大多数数据库系统规划建议是使用一个无意义的、可自增长的字段作为主键的值。

一、序列简介
ORACLE的序列是一种数据库对象,主要用来为表产生唯一值。
我们可以通过数据字典找到序列对象,因此可以被多个对象共享。
我们主要使用序列来创建一个主键的值,它对于每一行必须是唯一的。

二、创建数据序列

点击(此处)折叠或打开

  1. create sequence invoice_seq
  2. increment by 1
  3. start with 1
  4. maxvalue 99999
  5. nocycle nocache
  6. ;
INCREMENT BY:用于定义序列的步长,如果省略则默认为1,如果负值,则代表序列的值是按照此步长递减的。
START WITH:定义序列的初始值,默认为1.
MAXVALUE:定义序列生成器能产生的最大值
CYCLE和NOCYCLE:表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。
CACHE:定义存放序列的内存块的大小,默认为20.NOCACHE表示不对序列进行内存缓冲。
注意:序列如果用来产生主键,不建议使用CYCLE选项。

我们可以通过user_objects和user_sequences查看序列的相关信息。

点击(此处)折叠或打开

  1. SQL> select object_id,object_name,object_type from user_objects where object_name=upper('invoice_seq');
  2.  
  3.  OBJECT_ID OBJECT_NAME OBJECT_TYPE
  4. ---------- -------------------------------------------------------------------------------- -------------------
  5.      74775 INVOICE_SEQ SEQUENCE

点击(此处)折叠或打开

  1. SQL> select sequence_name,min_value,max_value,increment_by,last_number from user_sequences;
  2.  
  3. SEQUENCE_NAME                   MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER
  4. ------------------------------ ---------- ---------- ------------ -----------
  5. INVOICE_SEQ                         1        99999       1            1

三、NEXTVAL和CURRVAL伪列
NEXTVAL:返回下一个可用的序列值。
CURRVAL:获得当前的序列值。
当使用sequence.NEXTVAL时,一个新的序列数被产生并且当前的序列数被放入CURRVAL,而CURRVAL伪列用于查询用户刚才产生的序列数。

点击(此处)折叠或打开

  1. SQL> select sequence_name,min_value,max_value,increment_by,last_number from user_sequences;
  2.  
  3. SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER
  4. ------------------------------ ---------- ---------- ------------ -----------
  5. INVOICE_SEQ 1 99999 1 1

点击(此处)折叠或打开

  1. SQL> select invoice_seq.NEXTVAL from dual;
  2.  
  3.    NEXTVAL
  4. ----------
  5.          1

点击(此处)折叠或打开

  1. SQL> select invoice_seq.CURRVAL from dual;
  2.  
  3.    CURRVAL
  4. ----------
  5.          1

四、使用数据序列

点击(此处)折叠或打开

  1. SQL> create table invoice
  2.   2 (
  3.   3 invoice_id NUMBER PRIMARY KEY,
  4.   4 vendor_id NUMBER NOT NULL,
  5.   5 invoice_number VARCHAR2(50) NOT NULL,
  6.   6 invoice_date DATE DEFAULT SYSDATE,
  7.   7 invoice_total NUMBER(9,2) NOT NULL,
  8.   8 payment_total NUMBER(9,2) DEFAULT 0
  9.   9 )
  10.  10 ;
  11.  
  12. Table created

点击(此处)折叠或打开

  1. SQL> insert into invoice
  2.   2 (invoice_id,vendor_id,invoice_number,invoice_total)
  3.   3 values(invoice_seq.NEXTVAL,10,'INV'||invoice_seq.currval,100)

点击(此处)折叠或打开

  1. SQL> select invoice_id,vendor_id,invoice_number,invoice_total from invoice;
  2.  
  3. INVOICE_ID VENDOR_ID INVOICE_NUMBER INVOICE_TOTAL
  4. ---------- ---------- -------------------------------------------------- -------------
  5.          4 10 INV4 100.00

五、修改序列
我们有时候需要修改序列,比如重新制定cycle、cache、maxvalue、minvalue、increment by。

点击(此处)折叠或打开

  1. ALTER SEQUENCE sequence
  2.       [INCREMENT BY n]
  3.       [{MAXVALUE n|NOMAXVALUE}]
  4.       [{MINVALUE n|NOMINVALUE}]
  5.       [{CYCLE|NOCYCLE}]
  6.       [{CACHE n|NOCACHE}];
注意:
1.不能修改序列的起始值,如果想以不同的数字重新开始一个序列,必须删除序列重建。
2.序列的最小值不能大于序列的当前值。
3.序列的最大值不能小于序列的当前值。
4.修改后的序列规则不影响以前的序列值,只有未来的序列值会受到影响。
5.用户必须具有ALTER SEQUENCE的权限。

点击(此处)折叠或打开

  1. SQL> select invoice_id,vendor_id,invoice_number,invoice_total from invoice;
  2.  
  3. INVOICE_ID VENDOR_ID INVOICE_NUMBER INVOICE_TOTAL
  4. ---------- ---------- -------------------------------------------------- -------------
  5.          4 10 INV4 100.00

六、删除序列

点击(此处)折叠或打开

  1. drop sequence invoice_seq;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31355629/viewspace-2141267/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2016-06-03

  • 博文量
    38
  • 访问量
    53166