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

DB2 自動增長主鍵完整指南:IDENTITY 與 SEQUENCE 兩大機制深度解析

     編輯:DB2 教學

前言

在 DB2 資料庫設計中,自動生成唯一鍵值是基礎且關鍵的需求。DB2 提供了兩種截然不同的機制:IDENTITY 欄位與SEQUENCE 物件。本文深入解析兩者的語法、特性、適用場景與選型策略,助您做出最佳架構決策。

一、IDENTITY 欄位:表級自增方案

1. 基本語法

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)
);

2. 進階選項

  • GENERATED ALWAYS:系統強制生成值,插入時不可指定該欄位
  • GENERATED BY DEFAULT:允許應用程式自行提供值,未提供時由系統生成
  • START WITH:起始值(預設 1)
  • INCREMENT BY:遞增間距(預設 1,可為負數實現遞減)
  • MINVALUE/MAXVALUE:數值範圍限制
  • CYCLE/NO CYCLE:是否循環使用
  • CACHE/NO CACHE:效能優化,預先配置數值至記憶體

3. 計算欄位變體

DB2 也支援根據其他欄位計算的生成欄位:

CREATE TABLE user (
    name VARCHAR(30),
    n1 INTEGER,
    n2 INTEGER,
    id INTEGER GENERATED ALWAYS AS (n1 + n2)
);

二、SEQUENCE 物件:跨表共享序列

1. 建立與使用

-- 建立序列
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;

2. 相容性語法

為相容 Oracle,DB2 也支援:

  • NEXTVAL 等同 NEXT VALUE FOR
  • PREVVAL 等同 PREVIOUS VALUE FOR

三、核心差異對比:選型決策矩陣

維度IDENTITY 欄位SEQUENCE 物件
作用範圍單一資料表資料庫層級,跨多表共享
每表數量限制每表最多一個無限制,可建立多個序列
數值生成時機INSERT 時自動生成應用程式顯式呼叫 NEXT VALUE
交易獨立性緊綁 INSERT 交易獨立於資料表操作
回滾行為已生成數值不回收(缺口)同樣不回收,但可手動控制
適用場景單表主鍵、簡單自增需求分散式主鍵、多表共享序列、複雜編號規則

四、進階應用場景

1. 多表共享主鍵空間

訂單系統中,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),
    ...
);

2. 複合編號規則

結合序列與日期產生業務友善編號:

CREATE SEQUENCE daily_seq START WITH 1;

-- 應用層邏輯:TO_CHAR(CURRENT DATE, 'YYYYMMDD') || LPAD(NEXT VALUE FOR daily_seq, 6, '0')
-- 產生格式:20240115000001

五、效能與維運考量

  • CACHE 設定:高併發環境建議 CACHE 20~100,減少鎖競爭;但需接受非連續數值
  • 避免熱點:大量並發 INSERT 時,IDENTITY 可能成為鎖熱點,考慮使用 SEQUENCE + 應用層批次取號
  • 監控缺口:定期檢查序列缺口大小,評估是否影響業務審計需求
  • 備份恢復:SEQUENCE 狀態需納入備份策略,跨環境遷移時注意序列值同步

六、遷移對照:Oracle → DB2

OracleDB2 對應方案
SEQUENCE 物件直接對應 DB2 SEQUENCE
TRIGGER + SEQUENCE 模擬自增使用 IDENTITY 欄位簡化
SYSGUID()使用 GENERATE_UNIQUE() 或 UUID UDF

結語

IDENTITY 與 SEQUENCE 各有千秋,單表簡單自增首選 IDENTITY,跨表共享或複雜編號規則選 SEQUENCE。理解兩者在交易邊界、併發行為、維運特性上的差異,才能設計出穩健且可擴展的資料庫架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved