Oracle數據庫之序列(sequence)
序列是一個計數器,它並不會與特定的表關聯。我們可以通過創建Oracle序列和觸發器實現表的主鍵自增。序列的用途一般用來填充主鍵和計數。
一、創建序列
語法結構:
CREATE SEQUENCE [ schema. ] sequence_name
[ { INCREMENT BY | START WITH } integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| ...
]...
;
完整語法結構見:http://docs.oracle.com/database/121/SQLRF/statements_6017.htm#SQLRF01314
說明:
- schema:模式,即用戶名稱
- sequence_name:序列名稱
- INCREMENT BY:定義序列的步長,如果省略,則默認爲1,如果出現負值,則代表Oracle序列的值是按照此步長遞減的。
- START WITH:定義序列的初始值,默認爲1。
- MAXVALUE:序列生成器能產生的最大值。NOMAXVALUE是默認選項,代表沒有最大值定義。
- MINVALUE:序列生成器能產生的最小值。NOMINVALUE是默認選項,代表沒有最小值定義。
- CYCLE和NOCYCLE:當序列生成器的值達到限制值後是否循環。CYCLE代表循環,NOCYCLE代表不循環。如果循環,則當遞增序列達到最大值時,循環到最小值,最小值爲1。對於遞減序列達到最小值時,循環到最大值。如果不循環,達到限制值後,繼續產生新值就會發生錯誤。
- CACHE:定義存放序列的內存塊的大小,默認爲20,相當於預加載。緩衝部分序列計數以便更快獲取序列值,可以改善序列的性能,但緩存選項可能會造成數據丟失。NOCACHE表示不緩衝。
示例:
CREATE SEQUENCE customers_seq
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
二、刪除序列
語法:
DROP SEQUENCE [ schema. ] sequence_name ;
示例:
DROP SEQUENCE customers_seq;
三、使用序列
序列有兩個屬性能夠獲取序列的值:
CURRVAL:返回序列的當前值。
NEXTVAL:返回序列下一個值。
示例:
INSERT INTO customers(id) VALUES (customers_seq.NEXTVAL);
SELECT customers_seq.CURRVAL FROM dual;
四、修改序列
語法:
ALTER SEQUENCE [ schema. ] sequence_name
{ INCREMENT BY integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| ...
} ...
;
完整語法結構見:http://docs.oracle.com/database/121/SQLRF/statements_2014.htm#SQLRF00817
注意,不能修改序列的初始值,否則會報ORA-02283。如果需要修改初始值,先刪除序列再重新創建序列設定初始值。
示例:
ALTER SEQUENCE customers_seq
MAXVALUE 1500;
ALTER SEQUENCE customers_seq
CYCLE
CACHE 5;
五、序列查看
SELECT * FROM USER_SEQUENCES;
SELECT * FROM ALL_SEQUENCES;
SELECT * FROM DBA_SEQUENCES;