Oracle 無原生 `AUTO_INCREMENT`/`IDENTITY` (12c 前),標準做法:Sequence 產生序號 + BEFORE INSERT Trigger 自動填入。
CREATE TABLE userlogin ( id NUMBER(6) NOT NULL, name VARCHAR2(30) NOT NULL PRIMARY KEY ) TABLESPACE users;
CREATE SEQUENCE userlogin_seq INCREMENT BY 1 START WITH 1 MINVALUE 1 MAXVALUE 9999999999999 NOCACHE ORDER;
參數解析:
CREATE OR REPLACE TRIGGER userlogin_trigger BEFORE INSERT ON userlogin FOR EACH ROW BEGIN SELECT userlogin_seq.NEXTVAL INTO :NEW.id FROM dual; END; / SHOW ERRORS
INSERT INTO userlogin (name) VALUES ('Alice');
INSERT INTO userlogin (name) VALUES ('Bob');
SELECT * FROM userlogin;
-- 結果
ID NAME
--- -----
1 Alice
2 Bob
CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次增量 START WITH 1 -- 起始值 NOMAXVALUE -- 無上限 (或 MAXVALUE 10000) NOCYCLE -- 不循環 (或 CYCLE 循環) CACHE 10; -- 記憶體預取 10 個 (預設 20)
| 偽欄位 | 行為 | 備註 |
|---|---|---|
NEXTVAL | 遞增並回傳新值 | 第一次回傳 START WITH 值 |
CURRVAL | 回傳當前值 | 需先在該 Session 執行過 NEXTVAL |
注意:同一語句多次引用 `NEXTVAL` 會產生不同值。
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (emp_seq.NEXTVAL, 'LEWIS', 'CLERK', 7902, SYSDATE, 1200, NULL, 20); SELECT emp_seq.CURRVAL FROM dual;
ALTER SEQUENCE emp_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE NOCACHE;
無法修改 `START WITH`,需 `DROP` 後重建。
`CACHE n` 會在記憶體預存 n 個值,效能較好。但 異常關機 (SHUTDOWN ABORT) 會導致快取中未用序號遺失,造成跳號。關鍵業務主鍵建議 `NOCACHE`。
DROP SEQUENCE order_seq;
Oracle 12c 引入標準身分欄位,語法更簡潔:
CREATE TABLE t ( id NUMBER GENERATED ALWAYS AS IDENTITY, name VARCHAR2(30) );
或允許手動指定:
id NUMBER GENERATED BY DEFAULT AS IDENTITY