修改欄位資料類型是高風險操作,本文提供無資料表直接修改、有資料表安全遷移兩套標準流程,並說明型別轉換限制與驗證要點。
ALTER TABLE table_name MODIFY (column_name new_data_type);
-- 範例
ALTER TABLE student MODIFY (id NUMBER(4));
ALTER TABLE table_name RENAME COLUMN column_name TO column_name_old;
ALTER TABLE table_name ADD column_name NEW_DATA_TYPE;
UPDATE table_name SET column_name = CAST(column_name_old AS NEW_DATA_TYPE);
Oracle 不支援隱式型別轉換更新,需顯式 CAST/TO_CHAR/TO_NUMBER/TO_DATE
ALTER TABLE table_name DROP COLUMN column_name_old;
| 來源型別 | 目標型別 | 轉換函數範例 | 風險提示 |
|---|---|---|---|
| VARCHAR2 | NUMBER | TO_NUMBER(col) | 非數字內容會報錯,需先清洗 |
| VARCHAR2 | DATE | TO_DATE(col, 'YYYY-MM-DD') | 格式不符會失敗,建議先用 REGEXP 過濾 |
| NUMBER | VARCHAR2 | TO_CHAR(col, 'FM999999.00') | 格式遮罩控制顯示精度 |
| DATE | TIMESTAMP | CAST(col AS TIMESTAMP) | 通常安全,精度擴展 |
| LONG | CLOB | TO_LOB(col) (僅限 CREATE TABLE AS SELECT) | LONG 限制多,建議同步遷移至 CLOB |
CREATE TABLE bak AS SELECT * FROM src) 或匯出 DMP。COUNT(*)、SUM()、MIN/MAX 一致。MODIFY 縮小精度 (如 NUMBER(10)→NUMBER(5)) 或變更字元集遵循四步遷移法並嚴格驗證,能將型別變更風險降至最低。