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

MySQL 與 Oracle 自動遞增欄位建立對比:AUTO_INCREMENT vs Sequence+Trigger

     編輯:MySQL 綜合教學

MySQL:AUTO_INCREMENT 一鍵搞定

CREATE TABLE article (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255)
);

INSERT INTO article (title) VALUES ('a');  -- id=1
INSERT INTO article (title) VALUES ('b');  -- id=2
INSERT INTO article (title) VALUES ('c');  -- id=3
-- 也可明確指定 NULL
INSERT INTO article VALUES (NULL, 'd');    -- id=4

特性:

  • 自動從 1 遞增,可 `ALTER TABLE article AUTO_INCREMENT=100` 重設起始值
  • `LAST_INSERT_ID()` 取得剛插入的 ID
  • InnoDB 持久化自增計數器 (8.0+),重啟不回滾

Oracle:Sequence + Trigger 手動實作

1. 建立 Sequence

CREATE SEQUENCE seq_test_ids
    MINVALUE 1
    MAXVALUE 99999999
    START WITH 1
    INCREMENT BY 1
    NOCACHE
    ORDER;

2. 建立 Trigger (BEFORE INSERT)

CREATE OR REPLACE TRIGGER tri_test_id
BEFORE INSERT ON test_table
FOR EACH ROW
DECLARE
    nextid NUMBER;
BEGIN
    IF :NEW.id IS NULL OR :NEW.id = 0 THEN
        SELECT seq_test_ids.NEXTVAL INTO nextid FROM dual;
        :NEW.id := nextid;
    END IF;
END tri_test_id;
/
-- 注意:Oracle 需斜線 / 結束 PL/SQL 區塊

3. 測試

INSERT INTO test_table (col1) VALUES ('x');  -- id 自動填 1
INSERT INTO test_table (col1) VALUES ('y');  -- id 自動填 2

對比總結

特性MySQL AUTO_INCREMENTOracle Sequence+Trigger
語法複雜度極簡 (1 行)需 2 物件 + PL/SQL
效能內核級優化Trigger 開銷略高
間隙處理Rollback/Delete 產生間隙NOCACHE 可減少間隙
跨表共享序列不支援Sequence 可多表共用
重設起始值ALTER TABLE ... AUTO_INCREMENT=nDROP/CREATE Sequence
取得最新 IDLAST_INSERT_ID()seq.CURRVAL / RETURNING INTO

Oracle 12c+ 新特性:Identity Column

CREATE TABLE article (
    id NUMBER GENERATED ALWAYS AS IDENTITY,
    title VARCHAR2(255)
);
-- 相當於內建 Sequence + Trigger,語法簡化

遷移建議

  • MySQL → Oracle:改寫為 Sequence + Trigger 或 12c Identity
  • Oracle → MySQL:直接用 `AUTO_INCREMENT`,注意序列值衝突需 `ALTER TABLE` 重設
  • 異構同步工具 (GoldenGate, CDC) 需正確映射自增邏輯
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved