Oracle Sequence 是獨立於資料表的序號產生器,廣泛用於主鍵自動遞增。本文涵蓋建立語法、取值方式、修改刪除、快取機制、觸發器整合實現自動填充主鍵全流程。
CREATE SEQUENCE seq_test INCREMENT BY 1 -- 每次遞增值 START WITH 1 -- 起始值 NOMAXVALUE -- 無上限 NOCYCLE -- 不循環 CACHE 10; -- 記憶體預取 10 個值(效能最佳),NOCACHE 避免跳號
| 參數 | 說明 |
|---|---|
| INCREMENT BY | 遞增間距,負數為遞減 |
| START WITH | 首次 NEXTVAL 回傳值 |
| MAXVALUE/NOMAXVALUE | 上限值/無上限 |
| CYCLE/NOCYCLE | 達上限後是否從 MINVALUE 重新開始 |
| CACHE/NOCACHE | 記憶體預取數量/不預取(崩潰不跳號但效能較差) |
-- 當前值(需先呼叫過 NEXTVAL) SELECT seq_test.CURRVAL FROM DUAL; -- 下一值(自動遞增並回傳) SELECT seq_test.NEXTVAL FROM DUAL;
INSERT INTO my_table (id, name) VALUES (seq_test.NEXTVAL, 'sequence 測試');
NEXTVAL 回傳 START WITH 值NEXTVAL 會產生不同值CURRVAL 僅在 Session 已呼叫過 NEXTVAL 後可用CACHE 導致非正常關機時序號跳號-- 修改參數(START WITH 不可改,需重建) ALTER SEQUENCE seq_test MAXVALUE 9999999; -- 刪除 DROP SEQUENCE seq_test;
-- 建立序列
CREATE SEQUENCE seq_id
MINVALUE 1 MAXVALUE 99999999
START WITH 1 INCREMENT BY 1
NOCACHE ORDER;
-- 建立觸發器
CREATE OR REPLACE TRIGGER tri_test_id
BEFORE INSERT ON s_depart
FOR EACH ROW
DECLARE
nextid NUMBER;
BEGIN
IF :NEW.departid IS NULL OR :NEW.departid = 0 THEN
SELECT seq_id.NEXTVAL INTO nextid FROM SYS.DUAL;
:NEW.departid := nextid;
END IF;
END tri_test_id;
:NEW:新資料列(插入/更新後):OLD:舊資料列(更新前/刪除):=:PL/SQL 賦值運算子INTO nextid:查詢結果賦值給區域變數SEQUENCE_CACHE_ENTRIES:系統級參數,控制同時可快取的序列數量ORDER 保證跨節點序號有序Sequence + 觸發器是 Oracle 實現自動遞增主鍵的標準模式,12c 起可直接使用 GENERATED AS IDENTITY 簡化寫法。