表結構演進是系統迭代常態。本文整理 Oracle 修改欄位的完整語法族群,涵蓋新增、修改型別/預設值/可空性、刪除、重命名欄位與表、新增註解,並說明關鍵限制與最佳實務。
ALTER TABLE table_name ADD (
column_name datatype [DEFAULT expr] [CONSTRAINT constraint_def],
...
);
-- 範例:新增員工編號,預設 0
ALTER TABLE emp01 ADD (eno NUMBER(4) DEFAULT 0);
注意:
• 11g 起支援 DEFAULT ... NOT NULL 瞬間完成(元資料級),無需全表更新
• 多欄位一次 ADD 減少鎖定時間
ALTER TABLE table_name MODIFY (
column_name datatype [DEFAULT expr] [NULL | NOT NULL],
...
);
-- 範例:擴大職稱長度並設新預設值
ALTER TABLE emp01 MODIFY job VARCHAR2(15) DEFAULT 'CLERK';
限制:
• 型別變更需資料相容(數字→字串需轉換)
• 擴大長度通常瞬間完成;縮小長度需驗證現有資料
• NOT NULL 只能加在無 NULL 值的欄位,或先更新 NULL 再加約束
-- 立即刪除(鎖表、釋放空間)
ALTER TABLE emp01 DROP COLUMN dno;
-- 標記刪除(11g+,元資料級,空間稍後回收)
ALTER TABLE emp01 SET UNUSED COLUMN dno;
ALTER TABLE emp01 DROP UNUSED COLUMNS;
建議:大表優先用 SET UNUSED 避免長時間鎖表,維護窗口再 DROP UNUSED COLUMNS。
ALTER TABLE emp01 RENAME COLUMN eno TO empno;
10g 起支援,舊版需 ADD 新欄位 → UPDATE → DROP 舊欄位。
RENAME emp01 TO employee;
等同 ALTER TABLE emp01 RENAME TO employee;,觸發器/視圖/同義詞需手動同步。
-- 表註解
COMMENT ON TABLE employee IS '存放員工基本資訊';
-- 欄位註解
COMMENT ON COLUMN employee.name IS '員工姓名,含中英文';
-- 查詢註解
SELECT table_name, comments FROM user_tab_comments WHERE table_name = 'EMPLOYEE';
SELECT column_name, comments FROM user_col_comments WHERE table_name = 'EMPLOYEE';
-- 移除註解
COMMENT ON TABLE employee IS '';
COMMENT ON COLUMN employee.name IS '';
-- 1. 原始表
CREATE TABLE staff (id NUMBER, name VARCHAR2(20));
-- 2. 新增入職日期、薪資、狀態
ALTER TABLE staff ADD (
hire_date DATE DEFAULT SYSDATE,
salary NUMBER(8,2) DEFAULT 30000,
status CHAR(1) DEFAULT 'A' CHECK (status IN ('A','L','R'))
);
-- 3. 擴大姓名長度、薪資精度
ALTER TABLE staff MODIFY (
name VARCHAR2(50),
salary NUMBER(10,2)
);
-- 4. 移除舊欄位、重命名
ALTER TABLE staff SET UNUSED COLUMN old_flag;
ALTER TABLE staff RENAME COLUMN id TO staff_id;
-- 5. 維護窗口回收空間
ALTER TABLE staff DROP UNUSED COLUMNS;
-- 6. 記錄變更說明
COMMENT ON TABLE staff IS '員工主檔 v2.1 2024-01-15 新增薪資欄位';
COMMENT ON COLUMN staff.salary IS '月薪,單位:元,含本薪+津貼';
| 操作 | 鎖模式 | 空間釋放 | 版本支援 |
|---|---|---|---|
| ADD (無 DEFAULT/NOT NULL) | Exclusive DDL | 無 | 所有版本 |
| ADD (DEFAULT + NOT NULL) | Exclusive DDL (瞬間) | 無 | 11gR2+ |
| MODIFY (擴大) | Exclusive DDL | 無 | 所有版本 |
| MODIFY (縮小/型別轉換) | Exclusive DDL (全表驗證) | 無 | 所有版本 |
| DROP COLUMN | Exclusive DDL (全表重組) | 立即 | 8i+ |
| SET UNUSED | Exclusive DDL (瞬間) | 延遲 | 8i+ |
| RENAME COLUMN | Exclusive DDL | 無 | 10g+ |