Oracle 無內建 AUTO_INCREMENT / IDENTITY (12c 前),需結合 Sequence (序列) 與 Trigger (觸發器) 實現主鍵自動遞增。本文提供標準範例與命名長度限制提醒。
-- 1. 建立資料表
CREATE TABLE tb_student (
id NUMBER(10) NOT NULL,
createtime DATE NOT NULL,
CONSTRAINT pk_tb_student PRIMARY KEY (id)
);
COMMENT ON TABLE tb_student IS '學生表';
COMMENT ON COLUMN tb_student.id IS '主鍵 ID';
COMMENT ON COLUMN tb_student.createtime IS '建立時間';
-- 2. 建立序列
CREATE SEQUENCE seq_tb_student
MINVALUE 1
NOMAXVALUE
START WITH 1
INCREMENT BY 1
NOCYCLE
NOCACHE;
-- 3. 建立觸發器:INSERT 時若未指定 ID,自動取序列下一值
CREATE OR REPLACE TRIGGER tr_tb_student
BEFORE INSERT ON tb_student
FOR EACH ROW
WHEN (NEW.id IS NULL)
BEGIN
SELECT seq_tb_student.NEXTVAL INTO :NEW.id FROM dual;
END;
/
WHEN (NEW.id IS NULL):僅在應用未提供 ID 時自動填充,保留手動指定 ID 的彈性。NOCACHE:避免實例重啟導致序列間隙;高併發場景可改 CACHE 20 提升效能。SEQ_、TR_ 前綴空間,避免建立序列/觸發器時超長。CREATE TABLE tb_student_new (
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
createtime DATE NOT NULL
);
12c 起原生支援 GENERATED ALWAYS AS IDENTITY,無需 Sequence + Trigger,語法更簡潔、效能更佳。
11g 及以前版本請採用「Sequence + BEFORE INSERT Trigger」模式;12c 以上優先使用 Identity Column。注意物件命名長度,預留前綴空間,避免部署失敗。