業務需求常要求調整欄位精度。無資料時可直接執行:
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;
缺點:欄位順序改變、可能導致列遷移、影響依賴欄位順序的應用程式。
核心思路:新增暫存欄位 → 清空原欄位 → 修改型別 → 回寫資料 → 清理暫存欄位。需停機操作,大量資料會產生較多 UNDO/REDO。
ALTER TABLE tb_test ADD permile_temp NUMBER;
ALTER TABLE tb_test MODIFY permile NULL;
UPDATE tb_test SET permile_temp = permile, permile = NULL;
COMMIT;
ALTER TABLE tb_test MODIFY permile NUMBER(5,2);
UPDATE tb_test SET permile = permile_temp, permile_temp = NULL;
COMMIT;
ALTER TABLE tb_test DROP COLUMN permile_temp;
ALTER TABLE tb_test MODIFY permile NOT NULL;
SELECT * FROM tb_test;
優勢:欄位名稱、順序、約束條件完全保留,應用程式零感知。
若業務不可中斷,可使用 DBMS_REDEFINITION 套件實現線上結構變更。步驟包含:建立中介表、啟動重定義、同步資料、完成切換。適用於 24/7 核心系統,但實作複雜度較高,需充分測試。
欄位型別變更看似簡單,實則考驗 DBA 對儲存引擎、鎖機制、應用相依性的綜合掌控。選對方案,事半功倍。