Oracle中 sequences(序列)介紹
Oracle提供了sequence物件,由系統提供自增長的序列號,用於生成資料庫資料記錄的自增長主鍵或序號的地方。如果當前的序列不存在,它會建立一個序列,如果存在,它首先要得到當前序列的最大值,然後再加一,實現自增長的功能。
建立序列命令
CREATE SEQUENCE [user.]sequence_name
[increment by n]
[start with n]
[maxvalue n | nomaxvalue]
[minvalue n | nominvalue];
[NOCYCLE] --
INCREMENT BY: 指定序列號之間的間隔,該值可為正的或負的整數,但不可為0。序列為升序。忽略該子句時,預設值為1。
START WITH:指定生成的第一個序列號。在升序時,序列可從比最小值大的值開始,預設值為序列的最小值。對於降序,序列可由比最大值小的值開始,預設值為序列的最大值。
MAXVALUE:指定序列可生成的最大值。
NOMAXVALUE:為升序指定最大值為1027,為降序指定最大值為-1。
MINVALUE:指定序列的最小值。
NOMINVALUE:為升序指定最小值為1。為降序指定最小值為-1026。
NOCYCLE:一直累加,不迴圈。
在PLSQL Developer中可以直接找Sequences,新建序列,如下:
需要注意的是,cache的作用是當大量語句發生請求,申請序列時,為了避免序列在運用層實現序列而引起的效能瓶頸。Oracle序列允許將序列提前生成 cache x個先存入記憶體,在發生大量申請序列語句時,可直接到執行最快的記憶體中去得到序列。但是如果設定了CACHE值,ORACLE將在記憶體裡預先放置一些sequence,以使存取速度更快。cache裡面的取完後,oracle自動再取一組到cache。 但是,使用cache可能會跳號, 當遇到資料庫突然異常down掉(shutdown abort),cache中的sequence就會丟失.
因此,推薦在create sequence的時候使用 nocache 選項。
修改序列命令
使用者必須擁有ALTER ANY SEQUENCE 許可權才能修改sequence. 可以alter除start至以外的所有sequence引數.
如果想要改變start值,必須 drop sequence 再 re-create.
語法如下:
ALTERSEQUENCE [user.]sequence_name
[INCREMENT BY n]
[MAXVALUE n| NOMAXVALUE ]
[MINVALUE n | NOMINVALUE];
當然,最方便的還是可以在PLSQL Developer中直接修改。可以修改未來序列值的增量;設定或撤消最小值或最大值;改變緩衝序列的數目;指定序列號是否是有序。使用序列命令
sequence.CURRVAL -- 返回 sequence的當前值
sequence.NEXTVAL -- 增加sequence的值,然後返回 sequence 值
[注意]
第一次NEXTVAL返回的是初始值;
隨後的NEXTVAL會自動增加你定義的INCREMENT BY值,然後返回增加後的值。
CURRVAL 總是返回當前SEQUENCE的值,但是在第一次NEXTVAL初始化之後才能使用CURRVAL,否則會出錯。
一次NEXTVAL會增加一次 SEQUENCE的值,所以如果你在同一個語句裡面使用多個NEXTVAL,其值就是不一樣的。
LAST_NUMBER 為最終序列號,也就是sequence遊標當前所在的位置。
//get sequence last_number
SELECT LAST_NUMBER FROM USER_SEQUENCES WHERE SEQUENCE_NAME=TEST_SEQNAME
// NEXTVAL 使遊標指向下一位(增一或減一)
SELECT SEQNAME.NEXTVAL FROM USER_SEQUENCES 得到下一位遊標的值
刪除序列命令
DROP SEQUENCE 序列名;