在建表時指定 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。欄位值由其他欄位運算得出,非自增序列:
CREATE TABLE user (
name VARCHAR(30),
n1 INT,
n2 INT,
id INT GENERATED ALWAYS AS (n1 + n2)
);
獨立於資料表的序列產生器,可被多表、多欄位共享。
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);
| 情境 | 建議 | 理由 |
|---|---|---|
| 單一表單欄自增、作為主鍵、與 INSERT 緊密綁定 | IDENTITY | 語法簡單、自動管理、效能最佳 |
| 多張表共用同一序列 (如全域訂單號) | SEQUENCE | 跨表共享、可獨立于 INSERT 操作呼叫 |
| 單表多欄需自動產生值 | SEQUENCE | IDENTITY 限制單欄 |
| 需在 INSERT 前預知序列值 (如業務邏輯預先配號) | SEQUENCE | 可先 NEXT VALUE 取值再用於多處 |
單表主鍵首選 IDENTITY;跨表共享、複雜編號規則則用 SEQUENCE。善用兩者特性,可簡化應用程式邏輯並確保唯一性。