CHECK 約束在資料寫入前驗證條件運算式,**結果必須為 TRUE** 才允許寫入。支援單欄位多條件、多欄位交叉驗證、與 NOT NULL 共存。本文系統整理語法、建立、修改、刪除與實戰範例。
CREATE TABLE table_name ( col1 data_type, col2 data_type, ... [CONSTRAINT constraint_name] CHECK (condition_involving_multiple_columns) );
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
-- 新增第二個條件:年齡 < 100 ALTER TABLE p3 ADD CONSTRAINT check2_p3age CHECK (page < 100); INSERT INTO p3 VALUES (4, 'David', 100); -- 失敗 ORA-02290 (CHECK2_P3AGE) INSERT INTO p3 VALUES (4, 'David', 99); -- 成功
ALTER TABLE p3 DROP CONSTRAINT check2_p3age;
| 限制 | 說明 | 替代方案 |
|---|---|---|
| 不可包含子查詢 | CHECK 條件不可查詢其他表/列 | 觸發器 (TRIGGER) 或應用層驗證 |
| 不可呼叫非確定性函數 | SYSDATE、USER、ROWNUM 等不可用 | 觸發器或虛擬欄位 (12c+) |
| 不可包含伪欄位 | CURRVAL、NEXTVAL、LEVEL、ROWID 不可用 | 觸發器 |
| 啟用驗證既有資料 | ENABLE VALIDATE 會掃全表 | 大表用 ENABLE NOVALIDATE 後補驗證 |
SELECT CONSTRAINT_NAME, TABLE_NAME, SEARCH_CONDITION, STATUS FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'C' AND CONSTRAINT_NAME NOT LIKE 'SYS_%'; -- 過濾 NOT NULL 產生的系統約束 -- 更精確:僅顯示使用者定義的 CHECK SELECT UC.CONSTRAINT_NAME, UC.TABLE_NAME, UC.SEARCH_CONDITION FROM USER_CONSTRAINTS UC JOIN USER_CONS_COLUMNS UCC ON UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME WHERE UC.CONSTRAINT_TYPE = 'C' AND UC.GENERATED = 'USER NAME';
CHK_TABLE_COL_RULE (如 CHK_EMP_AGE_RANGE)