詳解序列(sequence)

pingley發表於2012-02-07
詳解序列(sequence)
sequences(序列):系列用於產生一系列的整數,用於輔助組織機構的內部控制(審計與追蹤)或者簡單的用作主鍵。
當用序列來產生主鍵值的時候,該主鍵通常被叫做代理主鍵。相應的還有自然主鍵一說。
建立序列的語法格式:
CREATE SEQUENCE sequencename
[INCREMENT BY value]
[START WITH value]
[{MAXVALUE value | NOMAXVALUE}]
[{MINVALUE value | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{ORDER | NOORDER}]
[{CACHE value | NOCACHE}];
建立序列的語法中大部分語句是可選的。

Create sequence 後面的序列名一般是以“_seq”結尾的,方便將來的標識。
INCREMENT BY 表示兩個序列之間的間隔(interval),預設是增加1,可以根據業務的需要調整間隔。
指定正數表示是升序的,負數表示是降序的。
START WITH 表示序列的起點值,預設是1.可以根據業務的需求設定。如果在一個已經存在編號的表中引入序列,
確保所建立的序列的起點值大於表中最大的編號值。
如果一個序列是遞增的使用MINVALUE沒有意義。此時序列的最小值是START(起點)值。
如果序列式遞減的如果你設定了MINVALUE值,MAXVALUE值也應該設定,一般與START值保持一致。
如果不指定最小值與最大值,oracle預設使用NOMAXVALUE與NOMINVALUE值。
oracle 序列的預設值:
對一個遞增序列,NOMINVALUE的值是1.對於一個遞減序列NOMINVALUE的值是-10^26
對一個遞增序列,NOMAXVALUE的值是10^26,對於一個遞減序列NOMAXVALUE的值是-1.
CYCLE 與 NOCYCLE選項,表示當序列到達了最大值或者最小值的時候,是否迴圈使用序列值。
注意如果序列是用作主鍵值得話,使用迴圈選項會產生問題。然而有些組織迴圈使用這些序列值,
因為他們不想讓序列值無限的增大。Oracle預設是不啟用迴圈。如果序列值耗盡,使用者或者程式獲取序列值的時候會返回錯誤。
ORDER 與NOORDER,oracle預設是不啟用order的,也就是說預設使用noorder。
Order表示按照收到請求序列值的先後順序返回相應的序列值。
比如A使用者先請求,B使用者後請求,如果序列值是遞增的,那麼A使用者獲得值如果是10,那麼B使用者獲得的值就是11了。
CACHE與NOCACHE,如果要在短期內產生大量的序列值,會消耗系統比較多的資源,使系統的效能變差。
如果使用的是CACHE選項,oracle一次會一次產生一組值,然後把他們放在記憶體中快取起來。
如果使用的是NOCACHE選項,則是收到一個請求產生一個值。如果使用者在建立序列的時候,沒有指定該項,
oracle預設使用CACHE 20。也就是在記憶體中快取20序列值供使用。

序列值之間產生間隔(gap)的原因:
序列值產生以後資料庫系統崩潰,重啟後這些崩潰時未被利用的序列值。不能再生。
回滾操作引起的序列值間隔。
由於序列值是一個獨立的物件。其他使用者或者表使用該序列,會引起序列值的間隔。
一個序列值產生以後就不能再次產生。除非等下一次迴圈。如果序列值是當做主鍵的值來使用的,間隔是無關緊要的問題。
序列是一個獨立的物件,不依附於某一張表,某一列,不同的使用者,不同的表也可以使用相同的序列。
如果序列是用於審計跟蹤,序列是由一張表獨享的,並且設定為NOCACHE。

SQL> create sequence orders_order#_seq
  2  increment by 1
  3  start with 1000
  4  nocache
  5  nocycle
  6  order;
Sequence created.

使用資料字典檢視user_sequenes查詢相關序列的詳細資訊
SQL> select * from user_sequences
  2  where sequence_name='ORDERS_ORDER#_SEQ';
SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
ORDERS_ORDER#_SEQ                       1 1.0000E+28            1 N Y          0        1000

使用nextval,currval偽列來獲得orders_order#_seq的值,nextval用於獲得下一個值,currval用於儲存最新獲得的值。
當一個使用者剛登陸到資料庫currval值是空的,需要先產生nextval。
SQL> select orders_order#_seq.nextval from dual;
   NEXTVAL
----------
      1000
SQL> select orders_order#_seq.currval from dual;
   CURRVAL
----------
      1000
SQL> desc customers
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CUSTOMER#                                 NOT NULL NUMBER(4)
 LASTNAME                                  NOT NULL VARCHAR2(10)
 FIRSTNAME                                 NOT NULL VARCHAR2(10)
 ADDRESS                                            VARCHAR2(20)
 CITY                                               VARCHAR2(12)
 STATE                                              VARCHAR2(2)
 ZIP                                                VARCHAR2(5)
 REFERRED                                           NUMBER(4)
 REGION                                             CHAR(2)
 EMAIL                                              VARCHAR2(30)
SQL> insert into customers
  2  values(orders_order#_seq.nextval, 'MORALES', 'BONITA', 'P.O. BOX 651', 'EASTPOINT', 'FL', '32328', NULL, 'S         E', '');
1 row created.
orders_order#_seq序列為客戶表的客戶ID(customer#)列提供數值。
SQL> select customer#
  2  from customers;
 CUSTOMER#
----------
      1001
      
序列可以使用alter sequence 語句修改.但是start with 子句在序列修改中是不能使用的。
其他選項和序列的建立沒有其別。
同時序列的修改不能使以前產生的序列值無效。
SQL> select * from user_sequences
  2  where sequence_name='ORDERS_ORDER#_SEQ';
SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
ORDERS_ORDER#_SEQ                       1 1.0000E+28            1 N Y          0        1002
其中last_number列會儲存下一個產生的序列值。
需要刪除某個序列的時候可以使用drop sequence sequence_name;
SQL> drop sequence orders_order#_seq;
Sequence dropped.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26110315/viewspace-715776/,如需轉載,請註明出處,否則將追究法律責任。

相關文章