DB2 的 IDENTITY 欄位(自增欄位)支援兩種產生模式:GENERATED ALWAYS 與 GENERATED BY DEFAULT。兩者在「是否允許手動指定值」與「唯一性保證」上有關鍵差異,選錯模式易導致主鍵衝突或資料不一致。
特性:值只能由 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 而回收,缺號是正常現象。
特性:若 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' | 跳過衝突值繼續 |
START WITH:起始值(預設 1)INCREMENT BY:遞增值(預設 1,可為負數)NO MINVALUE / NO MAXVALUE:無最小/最大值限制CACHE / NO CACHE:快取序號提升效能(預設 CACHE 20)CYCLE / NO CYCLE:達上限後是否循環(預設 NO CYCLE)