DB2 9.7 (V9) 以前,修改表結構常需「匯出資料 → DROP TABLE → CREATE TABLE → 導入資料 → 重建索引/權限/RI」,極其繁瑣。V9 引入線上 DDL能力,支援無停機修改:
ADD COLUMN、ALTER COLUMN SET DEFAULT、SET COMPRESS、LOB 選項、SCOPE、CONSTRAINT 管理ALTER TABLE V9R0M0.TRANSACTION DROP COLUMN INSTRUCTION_ID;
REORG 回收。-- SMALLINT → INTEGER (擴展範圍,安全)
ALTER TABLE DEV.ACCOUNT ALTER COLUMN ACCOUNT_ID SET DATA TYPE INTEGER;
ALTER TABLE DEV.TRANSACTION ALTER COLUMN ACCOUNT_ID SET DATA TYPE INTEGER;
-- VARCHAR(30) → VARCHAR(60) (擴大長度,安全)
ALTER TABLE DEV.TRANSACTION ALTER COLUMN DESCRIPTION SET DATA TYPE VARCHAR(60);
-- 移除 NOT NULL (允許 NULL)
ALTER TABLE DEV.ACCOUNT ALTER COLUMN CREDIT_LINE DROP NOT NULL;
-- 增加 NOT NULL (需確保現有資料無 NULL)
ALTER TABLE DEV.ACCOUNT ALTER COLUMN CREDIT_LINE SET NOT NULL;
SET NOT NULL 會全表掃描檢查是否有 NULL,有則報錯回滾。UPDATE ... SET COL=DEFAULT WHERE COL IS NULL 清理。ALTER TABLE T1 ALTER COLUMN COLNAM1 SET DEFAULT '123';
INSERT 未指定該列時的行為,現有資料不變。ALTER TABLE V9R0M0.ACCOUNT ADD COLUMN MANAGING_BANK VARCHAR(15);
DEFAULT、NOT NULL、GENERATED 等屬性。| 操作類型 | 鎖模式 | 並發影響 | 典型耗時 |
|---|---|---|---|
| DROP COLUMN / SET DATA TYPE (擴大) / SET DEFAULT | Z-lock (超級排他) 短時 | 極短暫阻塞寫入,讀取不受影響 (目前提交隔離級) | 毫秒~秒級 |
| SET DATA TYPE (縮小/跨族) / SET NOT NULL | X-lock (排他) 全表掃描期間 | 阻塞所有讀寫 | 分鐘~小時級 (視表大小) |
| ADD COLUMN | Z-lock 短時 | 極短暫 | 秒級 |
SELECT * FROM SYSCAT.COLUMNS WHERE TABNAME='...' 檢查索引、View、Trigger、MQT、RI、權限、Column Mask/Row Permission。RUNSTATS ON TABLE ... AND INDEXES ALL。DROP COLUMN 後空間未立即釋放,觀察 PCTFREE/PCTPAGESAVED 決定是否 REORG。DROP COLUMN、SET DATA TYPE、SET/DROP NOT NULL:需 DB2 9.7+ (LUW) / DB2 10+ (z/OS)。ADMIN_MOVE_TABLE 存儲過程(線上移表重建)或傳統 DROP/CREATE。