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

DB2 IDENTITY 自增欄位完整教學:GENERATED ALWAYS vs BY DEFAULT

     編輯:DB2 教學

DB2 的 IDENTITY 欄位(自增欄位)支援兩種產生模式:GENERATED ALWAYS 與 GENERATED BY DEFAULT。兩者在「是否允許手動指定值」與「唯一性保證」上有關鍵差異,選錯模式易導致主鍵衝突或資料不一致。

模式 A:GENERATED ALWAYS(完全由 DB2 產生)

特性:值只能由 DB2 自動產生,禁止 使用者在 INSERT 時指定值(含明確數值與 DEFAULT 關鍵字外的任何值)。

建表範例

CREATE TABLE t1 (
  id INT GENERATED ALWAYS AS IDENTITY (START WITH 100 INCREMENT BY 1),
  description CHAR(10)
);

操作行為示範

SQL 語句結果說明
INSERT INTO t1 VALUES (DEFAULT, 'a1')插入 100, 'a1'使用 DEFAULT 關鍵字,由 DB2 指派
INSERT INTO t1 (description) VALUES ('a1')插入 101, 'a1'省略 identity 欄位,DB2 自動填入
INSERT INTO t1 VALUES (200, 'a1')錯誤不允許手動指定數值
ROLLBACK 後再 INSERT插入 103, 'a1'回滾不會回收已配發的序號(102 變成缺號)

關鍵點:序號不會因 ROLLBACK 而回收,缺號是正常現象。

模式 B:GENERATED BY DEFAULT(預設由 DB2 產生,允許手動指定)

特性:若 INSERT 未指定值,DB2 自動產生;也允許 使用者明確提供數值。但 DB2 不保證唯一性,若手動插入的值與後續自動產生的值衝突,會拋出主鍵重複錯誤。

建表範例

CREATE TABLE t1 (
  id INT GENERATED BY DEFAULT AS IDENTITY (START WITH 100 INCREMENT BY 1),
  description CHAR(10)
) IN userspace1;

操作行為示範

SQL 語句結果說明
INSERT INTO t1 VALUES (DEFAULT, 'a1')插入 100, 'a1'自動產生
INSERT INTO t1 (description) VALUES ('a1')插入 101, 'a1'自動產生
INSERT INTO t1 VALUES (200, 'a1')插入 200, 'a1'允許手動指定
INSERT INTO t1 VALUES (102, 'a1')插入 102, 'a1'手動插入 102
再次 INSERT INTO t1 (description) VALUES ('a1')錯誤(主鍵重複)DB2 自動產生 102,但 102 已存在
再下一筆自動產生插入 103, 'a1'跳過衝突值繼續

選型建議

  • GENERATED ALWAYS:主鍵、代理鍵、嚴格要求唯一且不可人工干預的場景 (推薦預設選擇)
  • GENERATED BY DEFAULT:資料遷移、匯入舊資料需保留原有 ID、合併多來源資料時需手動指定 ID
  • 若使用 BY DEFAULT,務必加上 UNIQUE 或 PRIMARY KEY 約束,並在應用層避免手動值與自動值衝突

常用參數

  • START WITH:起始值(預設 1)
  • INCREMENT BY:遞增值(預設 1,可為負數)
  • NO MINVALUE / NO MAXVALUE:無最小/最大值限制
  • CACHE / NO CACHE:快取序號提升效能(預設 CACHE 20)
  • CYCLE / NO CYCLE:達上限後是否循環(預設 NO CYCLE)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved