Oracle ALTER TABLE ... MODIFY 修改欄位類型受限於資料相容性。本文總結三種場景對應策略,從直接修改到間接遷移,解決 ORA-01439 錯誤。
| 場景 | 資料狀態 | 類型轉換 | 可直接 MODIFY |
|---|---|---|---|
| 1 | 無資料 | 任意 | ✅ 是 |
| 2 | 有資料 | 相容(如 NCHAR → NVARCHAR2) | ✅ 是 |
| 3 | 有資料 | 不相容(如 NCHAR → VARCHAR2(40)) | ❌ 否,報 ORA-01439 |
ALTER TABLE tb MODIFY (name NVARCHAR2(20));
-- 1. 重命名原欄位 ALTER TABLE tb RENAME COLUMN name TO name_tmp; -- 2. 新增目標類型欄位 ALTER TABLE tb ADD name VARCHAR2(40); -- 3. 資料遷移(TRIM 移除 CHAR 型填充空白) UPDATE tb SET name = TRIM(name_tmp); -- 4. 刪除暫存欄位 ALTER TABLE tb DROP COLUMN name_tmp;
UPDATE 避免 UNDO 爆滿,考慮 DBMS_REDEFINITION 線上重定義DEFAULTDESC tb 確認新類型SELECT name, DUMP(name) FROM tb WHERE ROWNUM <= 5 檢查資料內容USER_INDEXES.STATUS核心原則:相容直改,不相容遷移。生產環境務必先在測試庫演練並備份。