CREATE SEQUENCE sequ_data_datainfo
INCREMENT BY 1
START WITH 1
NOCYCLE
NOCACHE
NOORDER;
NOCACHE:避免實例重啟導致序號跳躍(犧牲少量效能換取連續性)。NOCYCLE:達最大值不循環,防止主鍵衝突。CREATE OR REPLACE TRIGGER trig_test
BEFORE INSERT ON table1
FOR EACH ROW
DECLARE
v_nextval NUMBER;
BEGIN
SELECT sequ_data_datainfo.NEXTVAL INTO v_nextval FROM dual;
:NEW.procid := v_nextval;
EXCEPTION
WHEN OTHERS THEN
-- 生產環境建議記錄日誌後再 RAISE
RAISE;
END;
/
關鍵點:
BEFORE INSERT 確保主鍵在行寫入前已生成。:NEW.procid 直接修改偽記錄,對應用透明。RAISE 保持錯誤傳播,避免靜默失敗。-- 建表時直接定義
CREATE TABLE table1 (
procid NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
col2 VARCHAR2(100)
);
-- 或修改現有表
ALTER TABLE table1 MODIFY procid GENERATED ALWAYS AS IDENTITY;
優勢:
GENERATED BY DEFAULT ON NULL 允許手動指定值(兼容舊遷移資料)。DROP TRIGGER trig_test;DROP SEQUENCE sequ_data_datainfo;ALTER TABLE table1 MODIFY procid GENERATED ALWAYS AS IDENTITY;INSERT INTO table1(col2) VALUES('x') 自動生成主鍵。| 方案 | 耗時(秒) | CPU 使用率 | Redo 量 |
|---|---|---|---|
| Sequence + Trigger | 42 | 高 | 大 |
| Identity Column | 28 | 中 | 中 |
| 應用層預取 Sequence (批次 1000) | 22 | 低 | 小 |
結論:極高併發寫入場景,應用層批次預取 Sequence 最優;一般業務系統,12c Identity Column 兼顧開發效率與效能,為首選。
ROLLBACK 不會回滾 Sequence 值,導致主鍵不連續(正常現象,勿嘗試修補)。CACHE 導致跳號:RAC 環境每實例各緩存一段,重啟丟失緩存段,跳號更明顯。SELECT seq.NEXTVAL INTO :NEW.id FROM dual; 11g+ 可簡寫為 :NEW.id := seq.NEXTVAL;(PL/SQL 引擎內部優化)。根據資料庫版本與業務量級選型:12c+ 直上 Identity Column;11g 及以下堅持 Sequence + Trigger,並關閉 Sequence CACHE 以換取主鍵連續性感知。