首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle CHECK 約束詳解:定義規則、多約束共存、刪除級聯與資料字典查詢

     編輯:Oracle 資料庫基礎

CHECK 約束核心規則

  • 運算式必須引用表中一或多個欄位
  • 運算式結果必須為 Boolean (TRUE/FALSE/UNKNOWN)
  • 可在欄位級或表級定義
  • 同一欄位可定義多個 CHECK,並可與 NOT NULL 共存

建立範例

-- 欄位級單一 CHECK
CREATE TABLE employees (
  sal NUMBER(7,2) CONSTRAINT emp_sal_ck1 CHECK (sal > 0)
);

-- ALTER 新增第二個 CHECK (同欄位)
ALTER TABLE employees 
ADD CONSTRAINT emp_sal_ck2 CHECK (sal < 20000);

約束刪除操作

停用/啟用約束

  • 操作會觸發索引刪除與重建 (PK/UK/FK)
  • ALTER TABLE employees DISABLE/ENABLE CONSTRAINT emp_ename_pk
  • ALTER TABLE employees MODIFY CONSTRAINT emp_pk DISABLE/ENABLE

FK 參照鏈約束管理

  • 若 FK 正參照 UK/PK,無法直接停用 該 UK/PK
  • 解決順序:先停用 FK → 再停用 UK/PK
  • 或使用級聯:ALTER TABLE employees DISABLE PRIMARY KEY CASCADE (同時停用參照 FK)

約束資料字典查詢

語法說明
ALTER TABLE dept DROP UNIQUE (dname, loc)指定約束定義內容刪除
ALTER TABLE dept DROP CONSTRAINT dept_dname_loc_uk指定約束名稱刪除 (推薦)
ALTER TABLE ... DROP CONSTRAINT ... KEEP INDEX刪除約束但保留底層索引
ALTER TABLE dept DROP PRIMARY KEY CASCADE級聯刪除參照此 PK 的所有 FK

實用查詢範例

-- 查詢所有 CHECK 約束定義
SELECT constraint_name, search_condition
FROM user_constraints
WHERE constraint_type = 'C';

-- 查詢特定表所有約束與欄位
SELECT c.constraint_name, c.constraint_type, cc.column_name, cc.position
FROM user_constraints c, user_cons_columns cc
WHERE c.table_name = 'EMPLOYEES'
  AND c.constraint_name = cc.constraint_name
ORDER BY c.constraint_type, c.constraint_name;

最佳實踐

  1. 業務規則優先在資料庫層用 CHECK 約束強制 (最後防線)
  2. 命名規範:CK_表名_欄位_序號 或 CK_表名_業務含義
  3. 複雜驗證 (跨表、序列檢查) 改用觸發器或應用層
  4. 定期檢查 DISABLED 狀態約束,避免資料品質風險
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
視圖用途
USER/ALL/DBA_CONSTRAINTS約束基本資訊:名稱、類型 (C=CHECK, P=PK, R=FK, U=UK)、狀態 (ENABLED/DISABLED)
USER/ALL/DBA_CONS_COLUMNS約束對應欄位詳細資訊