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

DB2 自動遞增主鍵實作:IDENTITY 與 SEQUENCE 完整比較

     編輯:DB2 教學

IDENTITY 欄位 (單表自增)

在建表時指定 GENERATED ALWAYS AS IDENTITY,DB2 自動為每筆 INSERT 產生唯一遞增值。

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)
);
  • START WITH 1:初始值。
  • INCREMENT BY 1:遞增幅度。
  • 隱含 NOT NULL,不可再加 DEFAULT。
  • 每張表僅能有一個 IDENTITY 欄位。

GENERATED ALWAYS AS (運算式) - 計算欄位

欄位值由其他欄位運算得出,非自增序列:

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

SEQUENCE 物件 (跨表共享序列)

獨立於資料表的序列產生器,可被多表、多欄位共享。

CREATE SEQUENCE orders_seq START WITH 1 INCREMENT BY 1;

使用方式

  • 取得下一值:NEXT VALUE FOR orders_seq (或舊語法 NEXTVAL)
  • 取得前一值:PREVIOUS VALUE FOR orders_seq (或 PREVVAL)
INSERT INTO orders (order_id, cust_id) VALUES (NEXT VALUE FOR orders_seq, 100);
INSERT INTO order_items (item_id, order_id) VALUES (NEXT VALUE FOR orders_seq, PREVIOUS VALUE FOR orders_seq);

IDENTITY vs SEQUENCE 選擇指南

情境建議理由
單一表單欄自增、作為主鍵、與 INSERT 緊密綁定IDENTITY語法簡單、自動管理、效能最佳
多張表共用同一序列 (如全域訂單號)SEQUENCE跨表共享、可獨立于 INSERT 操作呼叫
單表多欄需自動產生值SEQUENCEIDENTITY 限制單欄
需在 INSERT 前預知序列值 (如業務邏輯預先配號)SEQUENCE可先 NEXT VALUE 取值再用於多處

常見限制提醒

  • IDENTITY 欄位資料類型須為精確數值型 (SMALLINT, INT, BIGINT, DECIMAL(n,0))。
  • ALTER TABLE 不支援新增/移除 IDENTITY 屬性 (需重建表)。
  • SEQUENCE 不支援 CYCLE 選項時達最大值會報錯,請依業務量規劃 MAXVALUE。

結語

單表主鍵首選 IDENTITY;跨表共享、複雜編號規則則用 SEQUENCE。善用兩者特性,可簡化應用程式邏輯並確保唯一性。

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