Oracle 12c 前無 GENERATED AS IDENTITY 語法,傳統做法是建立 SEQUENCE 產生流水號,搭配 BEFORE INSERT 觸發器自動填入主鍵欄位。
CREATE TABLE TEMP_TEST (
ID NUMBER PRIMARY KEY,
NM VARCHAR2(10)
);
CREATE SEQUENCE TEMP_TEST_IDADD
INCREMENT BY 1
START WITH 1
NOCACHE
NOCYCLE;
參數說明:INCREMENT BY 1 每次遞增 1,START WITH 1 從 1 開始,NOCACHE 不快取(確保不跳號,效能略降),NOCYCLE 不循環。
CREATE OR REPLACE TRIGGER T_TEMP_TEST_IDADD
BEFORE INSERT ON TEMP_TEST
FOR EACH ROW
BEGIN
SELECT TEMP_TEST_IDADD.NEXTVAL INTO :NEW.ID FROM DUAL;
END T_TEMP_TEST_IDADD;
/
-- 或簡寫(11g+)
-- :NEW.ID := TEMP_TEST_IDADD.NEXTVAL;
INSERT INTO TEMP_TEST (NM) VALUES ('ss');
INSERT INTO TEMP_TEST (NM) VALUES ('ss');
SELECT * FROM TEMP_TEST;
-- 結果:
-- ID NM
-- -- --
-- 1 ss
-- 2 ss

CREATE TABLE TEST_ID (
ID NUMBER GENERATED ALWAYS AS IDENTITY,
NM VARCHAR2(10)
);
或允許手動覆寫:
CREATE TABLE TEST_ID (
ID NUMBER GENERATED BY DEFAULT AS IDENTITY,
NM VARCHAR2(10)
);
CACHE 20(預設)可大幅提升高併發插入效能,但實例重啟會導致號碼跳躍ORDER 保證 RAC 環境下跨節點序號有序,效能稍低SELECT seq.NEXTVAL FROM DUAL 後再 INSERTDISABLE TRIGGER,改由匯入腳本指定 IDSequence + Trigger 是 Oracle 傳統自增主鍵標準做法,相容性最好;12c 以上新專案建議直接使用 Identity 欄位簡化維護。