在從源端抽取資料載入目標端後,常需為目標表補充主鍵 ID。本文對比 Oracle 環境下兩種主流生成方案:SYS_GUID() 全域唯一識別碼與 SEQUENCE + TRIGGER 自增數值,並給出 DDL 範例。
ALTER TABLE emp ADD id VARCHAR2(32) DEFAULT SYS_GUID();
後續 INSERT INTO emp (...) VALUES (...) 不指定 id 即可自動生成。
INCREMENT BY 1000 + START WITH 錯開)-- 1. 建立序列 (自定義起始值、步長、快取、循環)
CREATE SEQUENCE seq_id_add
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
-- 2. 建立觸發器
CREATE OR REPLACE TRIGGER trg_emp_pk
BEFORE INSERT ON emp1
FOR EACH ROW
BEGIN
SELECT seq_id_add.NEXTVAL INTO :NEW.id FROM dual;
END;
/
-- 3. 插入測試
INSERT INTO emp1 (ename, sal) VALUES ('TEST', 5000);
SELECT * FROM emp1; -- id 自動填入 1, 2, 3...
| 維度 | SYS_GUID | SEQUENCE + TRIGGER |
|---|---|---|
| 唯一性範圍 | 全域 (跨庫/跨節點) | 單庫/單序列 |
| 順序性 | 無序 | 嚴格遞增 |
| 索引效能 | 隨機分裂,需反向鍵索引緩解 | 極佳 (Append 模式) |
| 儲存空間 | 32 字元 / 16 位元組 | NUMBER(10-19) 可變 |
| 應用透明度 | 高 (DDL 預設值) | 需觸發器維護 |
| 推薦場景 | 分散式、資料合併、離線同步 | 單體核心業務表、高頻寫入 |
CREATE TABLE emp2 (
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
ename VARCHAR2(50)
);
-- 內建序列+觸發器,語法標準、效能最優、無額外物件
根據系統架構 (單體 vs 分散式)、寫入頻率、合併需求、索引維護成本綜合選型。