Oracle 不像 MySQL 內建 AUTO_INCREMENT,需自行結合 Sequence 實現。本文提供兩種成熟方案的完整建表、建序列、觸發器/顯式調用腳本,並附序列參數詳細解析,供直接複製套用。
CREATE SEQUENCE seq_name
[INCREMENT BY n] -- 步長,預設 1,負值為遞減
[START WITH n] -- 起始值,預設 1
[{MAXVALUE n | NOMAXVALUE}] -- 最大值,遞增預設 10^27
[{MINVALUE n | NOMINVALUE}] -- 最小值,遞減預設 -10^26
[{CYCLE | NOCYCLE}] -- 到達極值是否循環,預設 NOCYCLE
[{CACHE n | NOCACHE}]; -- 記憶體快取數量,預設 20
-- 1. 建立序列
CREATE SEQUENCE SEQ_T_RECV
MINVALUE 1 MAXVALUE 9999999
START WITH 1 INCREMENT BY 1 CACHE 50;
-- 2. 建立表
CREATE TABLE RECV_MSG (
id NUMBER,
messageid VARCHAR2(32),
contents VARCHAR2(2000),
app_flg VARCHAR2(100),
phonenumber VARCHAR2(2000),
updatetime DATE DEFAULT SYSDATE
);
-- 3. 建立觸發器
CREATE OR REPLACE TRIGGER recv_trig
BEFORE INSERT ON recv_msg
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
SELECT SEQ_T_RECV.NEXTVAL INTO :NEW.id FROM DUAL;
END;
-- 4. 測試驗證
INSERT INTO RECV_MSG (messageid, contents) VALUES ('msg001', 'first');
SELECT * FROM RECV_MSG; -- id = 1
-- 1. 建立序列 CREATE SEQUENCE seq_on_test INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE NOCACHE; -- 2. 建表 CREATE TABLE test ( ID INTEGER, stu_name NVARCHAR2(4), stu_age NUMBER ); -- 3. 插入資料 INSERT INTO test VALUES (seq_on_test.NEXTVAL, 'Mary', 15); INSERT INTO test VALUES (seq_on_test.NEXTVAL, 'Tom', 16); -- 4. 查詢結果 SELECT * FROM test; -- 1 Mary 15 -- 2 Tom 16 -- 5. 查詢序列狀態 SELECT seq_on_test.CURRVAL FROM DUAL; -- 2 SELECT seq_on_test.NEXTVAL FROM DUAL; -- 3
GENERATED AS IDENTITY。NOCACHE 視跳號容忍度決定。