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

DB2 ALTER TABLE 深度解析:V9 新增 DROP COLUMN、資料類型變更、可空性修改與實戰範例

     編輯:DB2 教學

ALTER TABLE 核心能力演進

DB2 9.7 (V9) 以前,修改表結構常需「匯出資料 → DROP TABLE → CREATE TABLE → 導入資料 → 重建索引/權限/RI」,極其繁瑣。V9 引入線上 DDL能力,支援無停機修改:

  • DROP COLUMN:直接刪除列
  • ALTER COLUMN SET DATA TYPE:變更資料類型(相容轉換)
  • SET NOT NULL / DROP NOT NULL:修改可空性
  • 既有功能:ADD COLUMN、ALTER COLUMN SET DEFAULT、SET COMPRESS、LOB 選項、SCOPE、CONSTRAINT 管理

新增核心語法與實戰範例

1. 刪除列:DROP COLUMN

ALTER TABLE V9R0M0.TRANSACTION DROP COLUMN INSTRUCTION_ID;
  • 瞬間完成(僅更新目錄),不掃描資料頁。
  • 列資料物理空間標記為可重用,後續 REORG 回收。
  • 限制:參與索引、RI、MDC、分區鍵、安全標籤的列不可直接刪,需先移除相依物件。

2. 變更資料類型:SET DATA TYPE

-- 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);
  • 安全轉換:同族擴大(INT→BIGINT、CHAR→VARCHAR、DECIMAL 增加精度/小數位)通常瞬時完成。
  • 風險轉換:縮小長度、跨族轉換(CHAR→INT、DATE→TIMESTAMP)需全表掃描驗證/轉換資料,耗時長且鎖表,建議維護窗口執行。
  • 外鍵欄位類型變更需同步修改父/子表,否則 RI 失效。

3. 修改可空性:SET/DROP NOT NULL

-- 移除 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 清理。

4. 修改預設值:SET DEFAULT

ALTER TABLE T1 ALTER COLUMN COLNAM1 SET DEFAULT '123';
  • 僅影響後續 INSERT 未指定該列時的行為,現有資料不變。
  • 新預設值需符合賦值規則與列定義限制。

5. 增加列:ADD COLUMN(舊功能補充)

ALTER TABLE V9R0M0.ACCOUNT ADD COLUMN MANAGING_BANK VARCHAR(15);
  • 新列附加在表尾(第 n+1 列)。
  • 不可導致總列長度超過最大記錄長度(頁面大小 - 系統開銷)。
  • 可指定 DEFAULT、NOT NULL、GENERATED 等屬性。

操作鎖定與並發影響

操作類型鎖模式並發影響典型耗時
DROP COLUMN / SET DATA TYPE (擴大) / SET DEFAULTZ-lock (超級排他) 短時極短暫阻塞寫入,讀取不受影響 (目前提交隔離級)毫秒~秒級
SET DATA TYPE (縮小/跨族) / SET NOT NULLX-lock (排他) 全表掃描期間阻塞所有讀寫分鐘~小時級 (視表大小)
ADD COLUMNZ-lock 短時極短暫秒級

最佳實務檢查清單

  1. 評估相依性:SELECT * FROM SYSCAT.COLUMNS WHERE TABNAME='...' 檢查索引、View、Trigger、MQT、RI、權限、Column Mask/Row Permission。
  2. 備份/快照:大表風險操作前執行資料庫/表空間備份或存儲快照。
  3. 維護窗口:全表掃描類操作安排在低峰期。
  4. 統計更新:結構變更後 RUNSTATS ON TABLE ... AND INDEXES ALL。
  5. REORG 評估:DROP COLUMN 後空間未立即釋放,觀察 PCTFREE/PCTPAGESAVED 決定是否 REORG。
  6. 應用程式同步:確認 ORM/實體類/預存程序/動態 SQL 同步更新欄位定義。

版本兼容性提醒

  • DROP COLUMN、SET DATA TYPE、SET/DROP NOT NULL:需 DB2 9.7+ (LUW) / DB2 10+ (z/OS)。
  • 舊版本唯一路徑:ADMIN_MOVE_TABLE 存儲過程(線上移表重建)或傳統 DROP/CREATE。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved