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

Oracle 實現自動遞增主鍵:Sequence + Trigger 模式完整範例

     編輯:Oracle 資料庫相關知識

Oracle 無自增欄位 (Auto Increment),標準做法是建立 SEQUENCE 搭配 BEFORE INSERT TRIGGER 自動賦值。本文提供完整 DDL 範例。

完整建表腳本

CREATE TABLE t_topic (
  topicId       NUMBER(18,0) NOT NULL,          -- 主題 ID (PK)
  topicTitle    VARCHAR2(100) NOT NULL,         -- 主題名
  topicContent  VARCHAR2(2000) NOT NULL,        -- 內容
  topicAuthor   VARCHAR2(20) NOT NULL,          -- 發表者
  topicBoaId    NUMBER(1,0) NOT NULL REFERENCES t_board(boaId), -- 所屬版塊
  topicHits     NUMBER(18,0) DEFAULT 0,         -- 點擊數
  topicElite    NUMBER(1,0) DEFAULT 0,          -- 是否精華
  topicTop      NUMBER(1,0) DEFAULT 0,          -- 是否置頂
  topicLock     NUMBER(1,0) DEFAULT 0,          -- 禁止回覆
  topicDel      NUMBER(1,0) DEFAULT 0,          -- 邏輯刪除
  topicPubTime  DATE NOT NULL,                  -- 建立時間
  topicReNum    NUMBER(18,0) DEFAULT 0,         -- 回覆總數
  topicReUser   VARCHAR2(20) DEFAULT '',        -- 最後回覆作者
  topicReTime   DATE,                           -- 最後回覆時間
  topicIp       VARCHAR2(15) DEFAULT '',        -- 發表 IP
  PRIMARY KEY (topicId)
);

-- 1. 建立 Sequence
CREATE SEQUENCE t_topic_Id_sequence
  INCREMENT BY 1
  START WITH 1
  NOMAXVALUE
  NOCYCLE
  NOCACHE;  -- 建議加 CACHE 20+ 提升效能

-- 2. 建立 Trigger
CREATE OR REPLACE TRIGGER t_topic_Id_trigger
BEFORE INSERT ON t_topic
FOR EACH ROW
DECLARE
  newId NUMBER(18,0);
BEGIN
  SELECT t_topic_Id_sequence.NEXTVAL INTO newId FROM dual;
  :new.topicId := newId;
END;
/

關鍵說明

  • NOCACHE 確保序列號連續 (效能較差);生產環境建議 CACHE 20 或更高,接受極少數間隙換取高併發效能。
  • Trigger 為 BEFORE INSERT ... FOR EACH ROW,確保每筆插入前自動填入主鍵。
  • Oracle 12c+ 可直接使用 GENERATED AS IDENTITY 簡化語法:
    topicId NUMBER(18) GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY

Sequence + Trigger 是 Oracle 歷代版本通用的自增主鍵標準解法,穩定可靠。

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