Oracle 無 AUTO_INCREMENT,需組合:**Sequence 產生值** + **BEFORE INSERT ROW TRIGGER 賦值**。
-- 1. 建立 Sequence
CREATE SEQUENCE seq_userid
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
-- 2. 建立觸發器
CREATE OR REPLACE TRIGGER users_bir
BEFORE INSERT ON users
FOR EACH ROW
DECLARE
l_nextval NUMBER;
BEGIN
SELECT seq_userid.NEXTVAL INTO l_nextval FROM dual;
:NEW.userid := 'USR' || LPAD(l_nextval, 7, '0'); -- 格式化:USR0000001
END;
/
-- 3. 測試
INSERT INTO users (name) VALUES ('Alice');
INSERT INTO users (name) VALUES ('Bob');
SELECT * FROM users;
NOCACHE:避免實例重啟導致序號跳躍(代價:每次 NEXTVAL 需磁碟 I/O)。高併發可用 CACHE 1000 並接受間隙。:NEW.column:觸發器中修改新行欄位值的語法。LPAD:左補零至固定寬度,便於排序與顯示。表名_BIR(Before Insert Row)或 表名_AIR(After Insert Row,但無法修改 :NEW)。CREATE TABLE users (
userid NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
name VARCHAR2(100)
);
支援 GENERATED BY DEFAULT ON NULL 允許手工指定值。新專案優先使用 IDENTITY,舊版相容才用 Sequence+Trigger。
| 方案 | 優點 | 缺點 |
|---|---|---|
| Sequence + Trigger | 全版本相容、可自定義格式 | 每行額外 Context Switch、Sequence 爭用(高併發) |
| IDENTITY (12c+) | 內核層實現、零 Context Switch、可縮放 | 需 12c+、格式固定為純數字 |