Oracle 無原生 AUTO_INCREMENT,標準做法:Sequence 產生值 + Before Insert Trigger 填入。本文提供完整可執行範例與進階選項說明。
-- 1. 建表
CREATE TABLE example (
id NUMBER(4) PRIMARY KEY,
name VARCHAR2(25),
phone VARCHAR2(10),
address VARCHAR2(50)
);
-- 2. 建立 Sequence
CREATE SEQUENCE emp_seq
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
NOCACHE; -- 若允許跳號可用 CACHE 20 提升效能
-- 3. 建立 Trigger
CREATE OR REPLACE TRIGGER example_bir
BEFORE INSERT ON example
FOR EACH ROW
WHEN (NEW.id IS NULL)
BEGIN
SELECT emp_seq.NEXTVAL INTO :NEW.id FROM dual;
END;
/
INSERT INTO example (name, phone, address) VALUES ('Cao', '56498543', 'Heibei');
INSERT INTO example (name, phone, address) VALUES ('Liu', '56498544', 'Beijing');
SELECT * FROM example;
-- ID 將自動為 1, 2...
| 子句 | 說明 |
|---|---|
| INCREMENT BY n | 每次遞增量(可負數) |
| START WITH n | 初始值 |
| MAXVALUE n / NOMAXVALUE | 上限 / 無上限(預設 10^27) |
| CYCLE / NOCYCLE | 達上限後循環 / 報錯 |
| CACHE n / NOCACHE | 預先在 SGA 緩存 n 個值(效能佳但 Crash 會跳號) |
| ORDER / NOORDER | RAC 環境下保證全域有序 / 不保證 |
emp_seq.NEXTVALemp_seq.CURRVAL(需先在 Session 呼叫過 NEXTVAL)ALTER SEQUENCE emp_seq INCREMENT BY 10 MAXVALUE 10000 CYCLE;DROP SEQUENCE emp_seq;CACHE 100~1000 + NOORDER,接受極少數跳號。NOCACHE + ORDER,效能較低但無間隙。IDENTITY COLUMN 簡化語法:id NUMBER GENERATED ALWAYS AS IDENTITY。Sequence + Trigger 是 Oracle 經典自增模式,理解 CACHE/ORDER 權衡,才能在效能與合規間找到平衡點。