ALTER TABLE table_name ADD (
column_name datatype [DEFAULT expr]
[, column_name2 datatype ...]
);
-- 示例
ALTER TABLE emp01 ADD eno NUMBER(4);
ALTER TABLE table_name MODIFY (
column_name datatype [DEFAULT expr] [NULL | NOT NULL]
[, column_name2 ...]
);
-- 示例:擴大長度、設置預設值
ALTER TABLE emp01 MODIFY job VARCHAR2(15) DEFAULT 'CLERK';
-- 立即刪除(10g+),釋放空間
ALTER TABLE emp01 DROP COLUMN dno;
-- 標記未用(舊版/大表避免鎖表),稍後 DROP UNUSED COLUMNS
ALTER TABLE emp01 SET UNUSED COLUMN dno;
ALTER TABLE emp01 DROP UNUSED COLUMNS;
ALTER TABLE emp01 RENAME COLUMN eno TO empno;
RENAME emp01 TO employee;
-- 或
ALTER TABLE emp01 RENAME TO employee;
COMMENT ON TABLE employee IS '存放員工信息';
COMMENT ON COLUMN employee.name IS '員工姓名';
COMMENT ON COLUMN employee.sal IS '月薪,單位:元';
查詢註釋:
SELECT * FROM user_col_comments WHERE table_name = 'EMPLOYEE';
SELECT * FROM user_tab_comments WHERE table_name = 'EMPLOYEE';
| 場景 | 處理建議 |
|---|---|
| 大表 ADD COLUMN 有默認值 | 11g+ 元數據級快速添加(不更新每行),極快。11g 前需全表更新,鎖表久,建議: 1) ADD 無默認值 → 2) 分批 UPDATE → 3) MODIFY DEFAULT |
| 大表 MODIFY 列類型/長度 | 可能觸發全表重組,鎖表時間長。建議: 1) 低峰期 → 2) DBMS_REDEFINITION 在線重定義 → 3) 或創建新表 CTAS + 重命名 |
| DROP COLUMN 空間未釋放 | 10g+ DROP COLUMN 會標記列刪除,空間標記為可用,但段大小不變。需 ALTER TABLE ... MOVE 或 SHRINK SPACE(啟用行移動)真正釋放。 |
| RENAME 導致視圖/同義詞/觸發器失效 | 重命名後需重新編譯依賴對象:EXEC DBMS_UTILITY.COMPILE_SCHEMA('SCOTT'); |
| 註釋中文亂碼 | 確保客戶端 NLS_LANG 與數據庫字符集一致(如 AL32UTF8),SQL*Plus/工具編碼設置正確。 |
DBMS_METADATA.GET_DDL('TABLE','EMP01')、導出數據樣本。v$session_wait、v$lock。DBMS_STATS.GATHER_TABLE_STATS、重新編譯失效對象 UTL_RECOMP.RECOMP_SERIAL。Oracle 表列修改看似簡單,大表環境下每個動作都可能引發鎖爭用、空間碎片、依賴對象失效。掌握 ADD/MODIFY/DROP/RENAME 語法細節、版本差異(11g+ 默認值優化)、DBMS_REDEFINITION 在線重定義、SHRINK SPACE 空間回收,並建立「備份→驗證→統計→編譯」標準化流程,是 DBA 與開發協作的必修課。