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

Oracle 表結構變更:添加與刪除列的標準語法、權限控制與最佳實踐

     編輯:Oracle 資料庫相關知識

標準語法

添加列

ALTER TABLE table_name ADD (column_name datatype [DEFAULT expr] [CONSTRAINT constraint_def]);

刪除列

-- 立即物理刪除 (10g+)
ALTER TABLE table_name DROP COLUMN column_name;

-- 兩階段刪除 (大表推薦,避免長時間鎖表)
ALTER TABLE table_name SET UNUSED COLUMN column_name;
-- 維護窗口執行
ALTER TABLE table_name DROP UNUSED COLUMNS;

實戰範例

-- 添加帶默認值的非空列 (大表瞬間完成,僅更新字典)
ALTER TABLE t_point_manage ADD (add_points_reason NUMBER(8) DEFAULT 0 NOT NULL);

-- 添加多列
ALTER TABLE t_point_manage ADD (
    create_by VARCHAR2(30) DEFAULT USER,
    create_dt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_by VARCHAR2(30),
    update_dt TIMESTAMP
);

-- 刪除單列
ALTER TABLE text_attr_detail DROP COLUMN add_points_reason;

-- 刪除多列 (12c+)
ALTER TABLE text_attr_detail DROP (col1, col2, col3);

跨 Schema 操作權限要求

-- 當前用戶非表擁有者時,需指定 Schema 並擁有權限
ALTER TABLE hr.employees ADD (middle_name VARCHAR2(20));

-- 所需權限:
-- 1. ALTER ANY TABLE 系統權限 (DBA 角色擁有)
-- 2. 或表擁有者授予: GRANT ALTER ON hr.employees TO app_user;

大表變更最佳實踐

Online DDL 技術 (12c+)

-- 12c+ 許多 DDL 操作支持 ONLINE 模式,不阻塞 DML
ALTER TABLE huge_table ADD (new_col VARCHAR2(100)) ONLINE;
ALTER TABLE huge_table DROP COLUMN old_col ONLINE;  -- 需先 SET UNUSED

零停機變更模式

  1. 添加列:指定 DEFAULT 值 → 瞬間完成 (僅字典更新)
  2. 修改列類型:創建新列 → 同步數據 → 重命名切換 → 刪除舊列
  3. 刪除列:SET UNUSED → 應用層停用 → 維護窗口 DROP UNUSED COLUMNS
  4. 重命名列:12c+ RENAME COLUMN 支持 ONLINE

空間回收策略

-- 刪除列後空間不自動回收,需重組
ALTER TABLE table_name MOVE;  -- 鎖表操作
-- 或 Online 重組 (需 Enterprise Edition)
DBMS_REDEFINITION.START_REDEF_TABLE(...);

約束與索引聯動處理

場景自動行為手動處理
刪除主鍵列報錯 ORA-02266先刪除主鍵約束: ALTER TABLE ... DROP PRIMARY KEY CASCADE
刪除外鍵引用列報錯 ORA-02298先刪除外鍵約束
刪除唯一索引列索引自動刪除無需手動
刪除普通索引列索引自動標記 UNUSABLE需 REBUILD 或 DROP

變更驗證清單

  • ☑ DESC table_name 確認列定義
  • ☑ SELECT * FROM user_tab_cols WHERE table_name = 'TABLE_NAME'; 檢查數據類型、默認值、NULLABLE
  • ☑ SELECT * FROM user_constraints WHERE table_name = 'TABLE_NAME'; 確認約束狀態
  • ☑ SELECT * FROM user_indexes WHERE table_name = 'TABLE_NAME'; 確認索引狀態
  • ☑ 應用層測試:插入/查詢/更新新列,驗證邏輯正確
  • ☑ 統計信息收集:DBMS_STATS.GATHER_TABLE_STATS 更新統計信息

常見錯誤代碼速查

錯誤原因解決
ORA-01430列已存在檢查列名拼寫、大小寫
ORA-00904標識符無效列名包含保留字/特殊字符,需雙引號
ORA-02266主鍵列不可刪除先 DROP PRIMARY KEY CASCADE
ORA-02298外鍵約束阻止先 DROP 外鍵約束
ORA-01735無效 ALTER TABLE 選項語法錯誤,檢查括號、關鍵字拼寫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved