首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 建立主鍵自增表:Sequence + Trigger 完整範例

     編輯:Oracle 資料庫相關知識

前言

Oracle 無內建 AUTO_INCREMENT / IDENTITY (12c 前),需結合 Sequence (序列) 與 Trigger (觸發器) 實現主鍵自動遞增。本文提供標準範例與命名長度限制提醒。

完整建表腳本

-- 1. 建立資料表
CREATE TABLE tb_student (
  id          NUMBER(10) NOT NULL,
  createtime  DATE       NOT NULL,
  CONSTRAINT pk_tb_student PRIMARY KEY (id)
);

COMMENT ON TABLE tb_student              IS '學生表';
COMMENT ON COLUMN tb_student.id          IS '主鍵 ID';
COMMENT ON COLUMN tb_student.createtime  IS '建立時間';

-- 2. 建立序列
CREATE SEQUENCE seq_tb_student
  MINVALUE 1
  NOMAXVALUE
  START WITH 1
  INCREMENT BY 1
  NOCYCLE
  NOCACHE;

-- 3. 建立觸發器:INSERT 時若未指定 ID,自動取序列下一值
CREATE OR REPLACE TRIGGER tr_tb_student
BEFORE INSERT ON tb_student
FOR EACH ROW
WHEN (NEW.id IS NULL)
BEGIN
  SELECT seq_tb_student.NEXTVAL INTO :NEW.id FROM dual;
END;
/

關鍵說明

  • WHEN (NEW.id IS NULL):僅在應用未提供 ID 時自動填充,保留手動指定 ID 的彈性。
  • NOCACHE:避免實例重啟導致序列間隙;高併發場景可改 CACHE 20 提升效能。
  • 物件命名長度限制:Oracle 物件名上限 30 字元。建議資料表名 ≤ 27 字元,預留 SEQ_、TR_ 前綴空間,避免建立序列/觸發器時超長。

替代方案:Oracle 12c+ Identity Column

CREATE TABLE tb_student_new (
  id          NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  createtime  DATE NOT NULL
);

12c 起原生支援 GENERATED ALWAYS AS IDENTITY,無需 Sequence + Trigger,語法更簡潔、效能更佳。

總結

11g 及以前版本請採用「Sequence + BEFORE INSERT Trigger」模式;12c 以上優先使用 Identity Column。注意物件命名長度,預留前綴空間,避免部署失敗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved