基本語法結構
ALTER TABLE table_name {
RENAME TO new_table_name
| ADD (col_def [, col_def]...)
| DROP COLUMN col_name
| MODIFY col_name new_datatype
| RENAME COLUMN old_name TO new_name
| ADD CONSTRAINT constraint_def
| DROP CONSTRAINT constraint_name [CASCADE]
| ENABLE/DISABLE CONSTRAINT constraint_name
};
實戰範例集
1. 表重命名
ALTER TABLE test RENAME TO test1;
-- 或標準 SQL
RENAME test1 TO test2;
2. 增加欄位
ALTER TABLE test2 ADD (c VARCHAR2(30));
ALTER TABLE test2 ADD (d VARCHAR2(30), e NUMBER(4));
3. 刪除欄位
ALTER TABLE test2 DROP COLUMN f;
-- 12c+ 可用 SET UNUSED 避免鎖表,稍後 DROP UNUSED COLUMNS
4. 修改欄位型別/長度
ALTER TABLE test2 MODIFY d VARCHAR2(40);
-- 注意:含資料欄位縮小長度需確保現有資料符合新長度,否則報 ORA-01441
5. 重命名欄位
ALTER TABLE test2 RENAME COLUMN e TO f;
6. 約束管理
-- 增加主鍵(複合鍵)
ALTER TABLE test2 ADD CONSTRAINT pk_mypri PRIMARY KEY (d, f);
-- 增加外鍵(複合鍵、級聯刪除)
ALTER TABLE employees ADD CONSTRAINT emp_jobs_fk
FOREIGN KEY (job, deptno) REFERENCES jobs (jobid, deptno) ON DELETE CASCADE;
-- 刪除主鍵並級聯刪除參考此主鍵的外鍵
ALTER TABLE dept DROP PRIMARY KEY CASCADE;
-- 停用/啟用約束(大量載入資料時提升效能)
ALTER TABLE emp DISABLE CONSTRAINT fk_deptno;
ALTER TABLE emp ENABLE CONSTRAINT fk_deptno;
進階特性(11g/12c/19c)
| 特性 | 語法範例 | 優點 |
| SET UNUSED | ALTER TABLE t SET UNUSED COLUMN col1; | 標記為未用,不實際刪除資料,鎖表極短,稍後 DROP UNUSED COLUMNS 批次清理 |
| ONLINE DDL | ALTER TABLE t MOVE PARTITION p1 ONLINE; | 12c+ 分區移動不阻塞 DML |
| DEFAULT ON NULL | ALTER TABLE t MODIFY col DEFAULT ON NULL 'N'; | 12c+ 插入 NULL 時自動套用 DEFAULT |
| INVISIBLE COLUMNS | ALTER TABLE t MODIFY col INVISIBLE; | 12c+ 對 SELECT * 隱藏,應用不受影響 |
| ADD COLUMN WITH DEFAULT | ALTER TABLE t ADD col NUMBER DEFAULT 0 NOT NULL; | 11g+ 瞬時完成(元資料修改),無需全表更新 |
避坑指南
- 大表 DROP COLUMN 會全表重寫,鎖表時間長,生產環境用
SET UNUSED + 維護窗口 DROP UNUSED COLUMNS。
- MODIFY 型別縮小 必須先驗證資料:
SELECT MAX(LENGTH(col)) FROM t 或 SELECT col FROM t WHERE LENGTH(col) > new_len。
- 外鍵 CASCADE 刪除父表記錄會連帶刪除子表記錄,極度謹慎,建議改用
ON DELETE SET NULL 或應用層軟刪除。
- 約束狀態:
ENABLE VALIDATE(預設,檢查現有資料)、ENABLE NOVALIDATE(僅檢查新資料,適合大表加約束)、DISABLE(不檢查)。
- 統計資訊:結構變更後執行
DBMS_STATS.GATHER_TABLE_STATS,否則優化器可能產生錯誤執行計畫。