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

Oracle 實現自動遞增欄位:Sequence + Row-Level Trigger 完整範例

     編輯:Oracle 資料庫相關知識

核心機制

Oracle 無 AUTO_INCREMENT,需組合:**Sequence 產生值** + **BEFORE INSERT ROW TRIGGER 賦值**。

完整 DDL

-- 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)。

12c 新語法:IDENTITY 欄位(免觸發器)

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+、格式固定為純數字
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved