自增主鍵是數據庫設計核心模式。DB2提供兩種機制:IDENTITY列與SEQUENCE對象。本文深度對比兩者差異,提供選型決策樹與實戰代碼。
| 維度 | IDENTITY列 | SEQUENCE對象 |
|---|---|---|
| 作用域 | 單表單列 | 跨表、跨列、跨Schema共享 |
| 綁定關係 | 緊耦合表定義 | 獨立對象,鬆耦合 |
| 每表數量 | 最多1個 | 無限制 |
| 值生成時機 | INSERT時自動 | 顯式調用NEXT VALUE |
| 事務獨立性 | 隨事務提交/回滾 | 獨立於事務(可選) |
| 緩存機制 | 不支援緩存 | 支援CACHE/NO CACHE |
| 循環選項 | 不支援CYCLE | 支援CYCLE/NO CYCLE |
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:起始值INCREMENT BY:步長(可負數,實現遞減)CACHE n:預分配緩存值(提升高併發性能,故障可能導致間隙)NO CACHE:不緩存(無間隙,性能稍低)CREATE SEQUENCE orders_seq
AS INTEGER
START WITH 1
INCREMENT BY 1
CACHE 20
NO CYCLE;
-- 獲取下一值(插入時使用)
INSERT INTO orders (order_id, ...) VALUES (NEXT VALUE FOR orders_seq, ...);
-- 獲取前一值(當前會話上一次生成的值)
VALUES PREVIOUS VALUE FOR orders_seq;
基於其他列計算生成值:
CREATE TABLE user (
name VARCHAR(30),
n1 INTEGER,
n2 INTEGER,
id INTEGER GENERATED ALWAYS AS (n1 + n2)
);
適用於衍生指標、冗余計算列物化場景。
NEXTVAL/PREVVAL別名單表簡單主鍵用IDENTITY;跨表共享、高併發、需緩存、遷移Oracle用SEQUENCE。理解兩者本質差異,按業務場景選型,避免過度設計。