在 DB2 資料庫設計中,自動生成唯一鍵值是基礎且關鍵的需求。DB2 提供了兩種截然不同的機制:IDENTITY 欄位與SEQUENCE 物件。本文深入解析兩者的語法、特性、適用場景與選型策略,助您做出最佳架構決策。
CREATE TABLE strategy (
strategy_id DECIMAL(17)
GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
PRIMARY KEY NOT NULL,
strategy_name VARCHAR(200),
area_code DECIMAL(6,0)
);
GENERATED ALWAYS:系統強制生成值,插入時不可指定該欄位GENERATED BY DEFAULT:允許應用程式自行提供值,未提供時由系統生成START WITH:起始值(預設 1)INCREMENT BY:遞增間距(預設 1,可為負數實現遞減)MINVALUE/MAXVALUE:數值範圍限制CYCLE/NO CYCLE:是否循環使用CACHE/NO CACHE:效能優化,預先配置數值至記憶體DB2 也支援根據其他欄位計算的生成欄位:
CREATE TABLE user (
name VARCHAR(30),
n1 INTEGER,
n2 INTEGER,
id INTEGER GENERATED ALWAYS AS (n1 + n2)
);
-- 建立序列
CREATE SEQUENCE orders_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
CACHE 20;
-- 取得下一值
SELECT NEXT VALUE FOR orders_seq FROM sysibm.sysdummy1;
-- 取得前一值(當前 session 最後生成的值)
SELECT PREVIOUS VALUE FOR orders_seq FROM sysibm.sysdummy1;
為相容 Oracle,DB2 也支援:
NEXTVAL 等同 NEXT VALUE FORPREVVAL 等同 PREVIOUS VALUE FOR| 維度 | IDENTITY 欄位 | SEQUENCE 物件 |
|---|---|---|
| 作用範圍 | 單一資料表 | 資料庫層級,跨多表共享 |
| 每表數量限制 | 每表最多一個 | 無限制,可建立多個序列 |
| 數值生成時機 | INSERT 時自動生成 | 應用程式顯式呼叫 NEXT VALUE |
| 交易獨立性 | 緊綁 INSERT 交易 | 獨立於資料表操作 |
| 回滾行為 | 已生成數值不回收(缺口) | 同樣不回收,但可手動控制 |
| 適用場景 | 單表主鍵、簡單自增需求 | 分散式主鍵、多表共享序列、複雜編號規則 |
訂單系統中,orders、order_items、order_logs 需共用同一編號空間,避免 ID 衝突:
CREATE SEQUENCE global_order_seq START WITH 100000;
CREATE TABLE orders (
order_id BIGINT DEFAULT NEXT VALUE FOR global_order_seq PRIMARY KEY,
...
);
CREATE TABLE order_items (
item_id BIGINT DEFAULT NEXT VALUE FOR global_order_seq PRIMARY KEY,
order_id BIGINT REFERENCES orders(order_id),
...
);
結合序列與日期產生業務友善編號:
CREATE SEQUENCE daily_seq START WITH 1;
-- 應用層邏輯:TO_CHAR(CURRENT DATE, 'YYYYMMDD') || LPAD(NEXT VALUE FOR daily_seq, 6, '0')
-- 產生格式:20240115000001
CACHE 20~100,減少鎖競爭;但需接受非連續數值| Oracle | DB2 對應方案 |
|---|---|
SEQUENCE 物件 | 直接對應 DB2 SEQUENCE |
TRIGGER + SEQUENCE 模擬自增 | 使用 IDENTITY 欄位簡化 |
SYSGUID() | 使用 GENERATE_UNIQUE() 或 UUID UDF |
IDENTITY 與 SEQUENCE 各有千秋,單表簡單自增首選 IDENTITY,跨表共享或複雜編號規則選 SEQUENCE。理解兩者在交易邊界、併發行為、維運特性上的差異,才能設計出穩健且可擴展的資料庫架構。