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 | 是(或用線上重定義) |