主鍵自增是關聯式資料庫最基礎也最關鍵的設計決策。三大主流資料庫實作機制迥異:MySQL `AUTO_INCREMENT`、SQL Server `IDENTITY`、Oracle `SEQUENCE + TRIGGER`。本文系統對比語法、參數、行為差異與進階操作 (如指定值插入、重置種子)。
CREATE TABLE customers (
id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
name VARCHAR(15)
);
INSERT INTO customers (name) VALUES ('name1'), ('name2');
SELECT id FROM customers; -- 1, 2
CREATE TABLE customers (
id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
name VARCHAR(15)
);
INSERT INTO customers (name) VALUES ('name1'), ('name2');
-- 指定值插入 (需開啟 IDENTITY_INSERT)
SET IDENTITY_INSERT customers ON;
INSERT INTO customers (id, name) VALUES (100, 'specified');
SET IDENTITY_INSERT customers OFF;
IDENTITY(種子, 增量) 靈活控制起始與步長 (如 `IDENTITY(1000, 10)`)。SET IDENTITY_INSERT ON 允許顯式插入身分值,同一時間僅一張表可開啟。-- 1. 建立序列
CREATE SEQUENCE customer_id_seq INCREMENT BY 2 START WITH 1;
-- 2. 建表 (無自增屬性)
CREATE TABLE customers (
id NUMBER PRIMARY KEY,
name VARCHAR2(15)
);
-- 3. 建立觸發器自動填充
CREATE OR REPLACE TRIGGER trg_customers
BEFORE INSERT ON customers FOR EACH ROW
BEGIN
SELECT customer_id_seq.NEXTVAL INTO :NEW.id FROM dual;
END;
-- 4. 插入測試
INSERT INTO customers (name) VALUES ('test');
SELECT id FROM customers; -- 1, 3, 5... (步長 2)
CURRVAL 取當前值,NEXTVAL 取下一值並遞增。CREATE TABLE customers (
id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) PRIMARY KEY,
name VARCHAR2(15)
);
-- 或 GENERATED BY DEFAULT ON NULL (允許顯式指定 NULL 觸發自增)
INSERT INTO customers (name) VALUES ('auto');
| 特性 | MySQL AUTO_INCREMENT | SQL Server IDENTITY | Oracle SEQUENCE | Oracle 12c+ IDENTITY |
|---|---|---|---|---|
| 語法簡潔度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ (需序列+觸發器) | ⭐⭐⭐⭐⭐ |
| 種子/增量可配置 | ❌ (僅 ALTER 起始值) | ✅ IDENTITY(seed, incr) | ✅ 序列屬性全控 | ✅ 子句指定 |
| 指定值插入 | 直接 INSERT id | SET IDENTITY_INSERT ON | 直接 INSERT seq.NEXTVAL | GENERATED BY DEFAULT ON NULL |
| 重置/同步種子 | ALTER TABLE ... AUTO_INCREMENT=n | DBCC CHECKIDENT RESEED | ALTER SEQUENCE ... RESTART | 同序列 |
| 效能/緩存 | InnoDB 內存計數器 | 內存緩存 (可追蹤旗標) | CACHE/NOCACHE 靈活 | 內建緩存 |
| 跨表共用 | ❌ | ❌ | ✅ 序列獨立物件 | ❌ |
| 跳號行為 | 重啟可能重用 (舊版) | 回滾/失敗會跳號 | 可控 (NOCACHE 不跳) | 同序列 |