| 操作 | 正確語法 | 錯誤示範 | 報錯代碼 |
|---|---|---|---|
| 新增 | ALTER TABLE t ADD col VARCHAR2(10); | ALTER TABLE t ADD COLUMN col VARCHAR2(10); | ORA-00905 |
| 修改 | ALTER TABLE t MODIFY col VARCHAR2(20); | ALTER TABLE t MODIFY COLUMN col VARCHAR2(20); | ORA-00905 |
| 刪除 | ALTER TABLE t DROP COLUMN col; | ALTER TABLE t DROP col; | ORA-00905 |
口訣:增改不用 COLUMN,刪除必加 COLUMN。
-- 新增多欄
ALTER TABLE t ADD (col1 VARCHAR2(10), col2 NUMBER);
-- 修改多欄
ALTER TABLE t MODIFY (col1 VARCHAR2(20), col2 VARCHAR2(20));
-- 刪除多欄
ALTER TABLE t DROP (col1, col2); -- 此處不可加 COLUMN
反直覺點:單欄刪除要 DROP COLUMN,多欄刪除卻不能加 COLUMN,否則 ORA-00905。
VARCHAR2(10) → VARCHAR2(20):安全,直接執行。NUMBER → VARCHAR2:需確保現有資料皆可隱式轉換,否則報錯。VARCHAR2(20) → VARCHAR2(10):先檢查 SELECT MAX(LENGTH(col)) FROM t;,超長資料需先截斷/遷移。DROP COLUMN ... ONLINE,不鎖表,適合大表。ALTER TABLE t SET UNUSED COLUMN col;(瞬間完成)ALTER TABLE t DROP UNUSED COLUMNS;(物理清理)。ALTER TABLE t RENAME COLUMN old_name TO new_name;
Oracle 不支援直接調整欄位順序。變通方案:
CREATE TABLE t_new AS SELECT col_new_order FROM t;DROP TABLE t; RENAME t_new TO t;| 錯誤 | 原因 | 解決 |
|---|---|---|
| ORA-01430 | 欄位已存在 | 檢查 USER_TAB_COLUMNS 避免重複 ADD |
| ORA-00904 | 欄位不存在 | 核對拼寫、大小寫(Oracle 預設大寫) |
| ORA-12992 | 嘗試刪除主鍵/唯一鍵欄位 | 先 DROP CONSTRAINT 再刪欄位 |
| ORA-01451 | 欄位被外鍵引用 | 先刪除子表外鍵或 CASCADE CONSTRAINTS |
掌握 ADD/MODIFY/DROP 與 COLUMN 關鍵字的精確搭配,善用 SET UNUSED 規避大表鎖表,配合 12c+ 新特性(ONLINE、RENAME),即能安全高效完成表結構演進。