Oracle數(shù)據(jù)庫中序列(SEQUENCE)的用法詳解
在Oracle數(shù)據(jù)庫中,什么是序列呢?它的用途是什么?序列(SEQUENCE)其實是序列號生成器,可以為表中的行自動生成序列號,產生一組等間隔的數(shù)值(類型為數(shù)字)。其主要的用途是生成表的主鍵值,可以在插入語句中引用,也可以通過查詢檢查當前值,或使序列增至下一個值。
創(chuàng)建序列需要CREATE SEQUENCE系統(tǒng)權限。序列的創(chuàng)建語法如下:
CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [] [{CACHE n|NOCACHE}];
INCREMENT BY 用于定義序列的步長,如果省略,則默認為1,如果出現(xiàn)負值,則代表序列的值是按照此步長遞減的。
START WITH 定義序列的初始值(即產生的***個值),默認為1。
MAXVALUE 定義序列生成器能產生的***值。選項NOMAXVALUE是默認選項,代表沒有***值定義,這時對于遞增序列,系統(tǒng)能夠產生的***值是10的27次方;對于遞減序列,***值是-1。
MINVALUE定義序列生成器能產生的最小值。選項NOMAXVALUE是默認選項,代表沒有最小值定義,這時對于遞減序列,系統(tǒng)能夠產生的最小值是?10的26次方;對于遞增序列,最小值是1。
CYCLE和NOCYCLE 表示當序列生成器的值達到限制值后是否循環(huán)。CYCLE代表循環(huán),NOCYCLE代表不循環(huán)。如果循環(huán),則當遞增序列達到***值時,循環(huán)到最小值;對于遞減序列達到最小值時,循環(huán)到***值。如果不循環(huán),達到限制值后,繼續(xù)產生新值就會發(fā)生錯誤。
CACHE(緩沖)定義存放序列的內存塊的大小,默認為20。NOCACHE表示不對序列進行內存緩沖。對序列進行內存緩沖,可以改善序列的性能。
刪除序列的語法是:
DROP SEQUENCE 序列名;
其中:
刪除序列的人應該是序列的創(chuàng)建者或擁有DROP ANY SEQUENCE系統(tǒng)權限的用戶。序列一旦刪除就不能被引用了。
序列的某些部分也可以在使用中進行修改,但不能修改SATRT WITH選項。對序列的修改只影響隨后產生的序號,已經產生的序號不變。
修改序列的語法如下:
創(chuàng)建和刪除序列
例1:創(chuàng)建序列:
CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 10 MAXVALUE 9999999 NOCYCLE NOCACHE;
執(zhí)行結果:
序列已創(chuàng)建。
步驟2:刪除序列:
DROP SEQUENCE ABC;
執(zhí)行結果:
序列已丟棄。
說明:以上創(chuàng)建的序列名為ABC,是遞增序列,增量為1,初始值為10。該序列不循環(huán),不使用內存。沒有定義最小值,默認最小值為1,***值為9 999 999。
序列的使用
如果已經創(chuàng)建了序列,怎樣才能引用序列呢?方法是使用CURRVAL和NEXTVAL來引用序列的值。
在編號的過程中,產生間隙的原因多種多樣。如果一個存儲過程從一個序列中挑選某個數(shù)字,定為本地變量,但是從來不用它,這個數(shù)字就丟失了。它將不能再返回到原序列中,結果就造成數(shù)值序列中存在一個間隙。關系型數(shù)據(jù)庫模型中不必擔心這一點。但是有時候人們在意這一點,這些人想知道是哪些數(shù)字丟失了。
調用NEXTVAL將生成序列中的下一個序列號,調用時要指出序列名,即用以下方式調用:
序列名.NEXTVAL
CURRVAL用于產生序列的當前值,無論調用多少次都不會產生序列的下一個值。如果序列還沒有通過調用NEXTVAL產生過序列的下一個值,先引用CURRVAL沒有意義。調用CURRVAL的方法同上,要指出序列名,即用以下方式調用:
序列名.CURRVAL.
產生序列的值。
步驟1:產生序列的***個值:
SELECT ABC.NEXTVAL FROM DUAL;
執(zhí)行結果:
NEXTVAL ------------------ 10
步驟2:產生序列的下一個值:
SELECT ABC.NEXTVAL FROM DUAL;
執(zhí)行結果:
NEXTVAL ------------------- 11
產生序列的當前值:
SELECT ABC.CURRVAL FROM DUAL;
執(zhí)行結果:
CURRVAL -------------------- 11
說明:***次調用NEXTVAL產生序列的初始值,根據(jù)定義知道初始值為10。第二次調用產生11,因為序列的步長為1。調用CURRVAL,顯示當前值11,不產生新值。Oracle的解析函數(shù)為檢查間隙提供了一種要快捷得多的方法。它們使你在使用完整的、面向集合的SQL處理的同時,仍然能夠看到下一個行(LEAD)或者前一行(LAG)的數(shù)值。
關于Oracle數(shù)據(jù)庫序列的知識就介紹到這里了,希望本次的介紹能夠帶給您一些收獲,謝謝!
【編輯推薦】