Oracle 無自增欄位 (Auto Increment),標準做法是建立 SEQUENCE 搭配 BEFORE INSERT TRIGGER 自動賦值。本文提供完整 DDL 範例。
CREATE TABLE t_topic ( topicId NUMBER(18,0) NOT NULL, -- 主題 ID (PK) topicTitle VARCHAR2(100) NOT NULL, -- 主題名 topicContent VARCHAR2(2000) NOT NULL, -- 內容 topicAuthor VARCHAR2(20) NOT NULL, -- 發表者 topicBoaId NUMBER(1,0) NOT NULL REFERENCES t_board(boaId), -- 所屬版塊 topicHits NUMBER(18,0) DEFAULT 0, -- 點擊數 topicElite NUMBER(1,0) DEFAULT 0, -- 是否精華 topicTop NUMBER(1,0) DEFAULT 0, -- 是否置頂 topicLock NUMBER(1,0) DEFAULT 0, -- 禁止回覆 topicDel NUMBER(1,0) DEFAULT 0, -- 邏輯刪除 topicPubTime DATE NOT NULL, -- 建立時間 topicReNum NUMBER(18,0) DEFAULT 0, -- 回覆總數 topicReUser VARCHAR2(20) DEFAULT '', -- 最後回覆作者 topicReTime DATE, -- 最後回覆時間 topicIp VARCHAR2(15) DEFAULT '', -- 發表 IP PRIMARY KEY (topicId) ); -- 1. 建立 Sequence CREATE SEQUENCE t_topic_Id_sequence INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE NOCACHE; -- 建議加 CACHE 20+ 提升效能 -- 2. 建立 Trigger CREATE OR REPLACE TRIGGER t_topic_Id_trigger BEFORE INSERT ON t_topic FOR EACH ROW DECLARE newId NUMBER(18,0); BEGIN SELECT t_topic_Id_sequence.NEXTVAL INTO newId FROM dual; :new.topicId := newId; END; /
NOCACHE 確保序列號連續 (效能較差);生產環境建議 CACHE 20 或更高,接受極少數間隙換取高併發效能。BEFORE INSERT ... FOR EACH ROW,確保每筆插入前自動填入主鍵。GENERATED AS IDENTITY 簡化語法:topicId NUMBER(18) GENERATED BY DEFAULT AS IDENTITY PRIMARY KEYSequence + Trigger 是 Oracle 歷代版本通用的自增主鍵標準解法,穩定可靠。