首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 表欄位 DDL 操作全攻略:增刪改語法、多欄位批次處理與常見坑點

     編輯:Oracle 資料庫相關知識

單欄位操作:關鍵字 COLUMN 的「有無之爭」

操作正確語法錯誤示範報錯代碼
新增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。

進階場景與最佳實踐

1. 修改欄位型別/長度的資料相容性檢查

  • VARCHAR2(10) → VARCHAR2(20):安全,直接執行。
  • NUMBER → VARCHAR2:需確保現有資料皆可隱式轉換,否則報錯。
  • VARCHAR2(20) → VARCHAR2(10):先檢查 SELECT MAX(LENGTH(col)) FROM t;,超長資料需先截斷/遷移。

2. 刪除欄位的效能與空間釋放

  • 12c+ 支援 DROP COLUMN ... ONLINE,不鎖表,適合大表。
  • 舊版本刪除大表欄位會全表掃描、產生大量 UNDO/REDO,建議:
    ALTER TABLE t SET UNUSED COLUMN col;(瞬間完成)
    維護窗口再 ALTER TABLE t DROP UNUSED COLUMNS;(物理清理)。

3. 欄位重命名(12c+)

ALTER TABLE t RENAME COLUMN old_name TO new_name;

4. 欄位排序調整

Oracle 不支援直接調整欄位順序。變通方案:

  1. 建新表 CREATE TABLE t_new AS SELECT col_new_order FROM t;
  2. 重建索引/約束/權限/同義詞。
  3. 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),即能安全高效完成表結構演進。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved