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

Oracle 欄位型別變更實戰:三種方案優劣對比與最佳實踐腳本

     編輯:Oracle 資料庫基礎

場景:NUMBER(5) → NUMBER(5,2) 型別精度調整

方案一:無資料表直接修改(最簡單)

ALTER TABLE tb_test MODIFY permile NUMBER(5,2);

✅ 無資料時可用 ❌ 有資料會報錯

方案二:新增暫存欄 → 複製 → 刪除舊欄 → 重命名(常見但有副作用)


ALTER TABLE tb_test ADD permile_temp NUMBER(5,2);
UPDATE tb_test SET permile_temp = permile;
ALTER TABLE tb_test DROP COLUMN permile;
ALTER TABLE tb_test RENAME COLUMN permile_temp TO permile;

缺點:欄位順序改變(新欄移至末尾)、可能導致列遷移、應用程式可能受影響(SELECT * 順序變化)

方案三:就地轉換法(推薦,無順序變更、無列遷移)


-- 1. 新增暫存欄
ALTER TABLE tb_test ADD permile_temp NUMBER;

-- 2. 移除原欄 NOT NULL 約束(若有)
ALTER TABLE tb_test MODIFY permile NULL;

-- 3. 第一輪更新:原值→暫存欄,原欄設 NULL
UPDATE tb_test SET permile_temp = permile, permile = NULL;
COMMIT;

-- 4. 修改原欄型別
ALTER TABLE tb_test MODIFY permile NUMBER(5,2);

-- 5. 第二輪更新:暫存值→原欄,暫存欄設 NULL
UPDATE tb_test SET permile = permile_temp, permile_temp = NULL;
COMMIT;

-- 6. 清理暫存欄,恢復 NOT NULL(若需)
ALTER TABLE tb_test DROP COLUMN permile_temp;
ALTER TABLE tb_test MODIFY permile NOT NULL;

-- 7. 驗證
SELECT * FROM tb_test;

方案對比總結

方案適用場景優點缺點停機需求
直接 MODIFY空表最簡單有資料失效否
重建欄法小表、可容忍順序變更邏輯直觀欄順序變、列遷移風險、應用影響是
就地轉換法生產環境、大表、嚴格要求欄順序不變、無列遷移、應用透明雙輪更新產生更多 UNDO/REDO是(或用線上重定義)

大表非停機方案:線上重定義 (DBMS_REDEFINITION)

  • 建立中介表(新結構)
  • 啟動重定義同步資料
  • 短暫鎖定完成切換
  • 適合 7×24 系統,代價是複雜度較高

核心建議

  1. 優先評估資料量與業務容忍停機時間
  2. 中小表首選就地轉換法
  3. 大表必須非停機時使用線上重定義
  4. 操作前務必完整備份,驗證腳本於測試環境
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved