首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 實現自增主鍵:Sequence + Trigger 完整範本 (11g/12c/19c 通用)

     編輯:Oracle 資料庫基礎

傳統做法:Sequence + BEFORE INSERT Trigger

適用於 11g 及之前版本,12c+ 仍可使用但建議改用 Identity Column。

1. 建表

CREATE TABLE downloadpope_tab (
  id     NUMBER NOT NULL,
  userid NUMBER NOT NULL,
  downid VARCHAR2(60),
  upid   VARCHAR2(60),
  CONSTRAINT pk_downloadpope_tab PRIMARY KEY (id)
);

2. 建立 Sequence

CREATE SEQUENCE downloadpope_tab_seq
  INCREMENT BY 1
  START WITH 1
  NOMAXVALUE
  NOCYCLE
  CACHE 20;  -- CACHE 提升高併發效能,預設 20

3. 建立 Trigger

CREATE OR REPLACE TRIGGER trg_downloadpope_tab_bir
BEFORE INSERT ON downloadpope_tab
FOR EACH ROW
BEGIN
  SELECT downloadpope_tab_seq.NEXTVAL
  INTO   :NEW.id
  FROM   DUAL;
END;
/

4. 測試插入

INSERT INTO downloadpope_tab (userid, downid, upid)
VALUES (100123, 'Oracle sql', '54.70');

SELECT * FROM downloadpope_tab;
-- ID 自動產生 1, 2, 3...

12c/19c 現代寫法:Identity Column (零維護)

CREATE TABLE downloadpope_tab (
  id     NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1 CACHE 20),
  userid NUMBER NOT NULL,
  downid VARCHAR2(60),
  upid   VARCHAR2(60),
  CONSTRAINT pk_downloadpope_tab PRIMARY KEY (id)
);
  • GENERATED ALWAYS:不可手動指定 ID (插入時省略 ID 欄位)。
  • GENERATED BY DEFAULT ON NULL:允許手動指定,NULL 時自動取序列值 (更彈性)。
  • 無需 Sequence/Trigger,DDL 更簡潔、效能略優、避免 Trigger 失效風險。

常見操作

操作指令
查詢序列目前值SELECT downloadpope_tab_seq.CURRVAL FROM DUAL;
手動取得下一值SELECT downloadpope_tab_seq.NEXTVAL FROM DUAL;
重設序列 (慎用)ALTER SEQUENCE downloadpope_tab_seq INCREMENT BY -999; SELECT ...; ALTER SEQUENCE ... INCREMENT BY 1;
刪除表/序列/觸發器DROP TABLE downloadpope_tab; DROP SEQUENCE downloadpope_tab_seq; DROP TRIGGER trg_downloadpope_tab_bir;

效能提示

  • 高併發插入建議 CACHE 100~1000 減少序列鎖競爭。
  • RAC 環境建議 ORDER 或 NOORDER 視業務是否需全域有序決定。
  • 12c+ Identity 內部即為 Sequence,同樣受益於 CACHE。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved