約束類型與驗證邏輯
| 約束類型 | 用途 | 違規時行為 |
| PRIMARY KEY |
唯一識別列,非空 |
拒絕 INSERT/UPDATE,SQLCODE -803 |
| FOREIGN KEY |
參考完整性,子表值必須存在於父表 |
拒絕 INSERT/UPDATE,SQLCODE -530 (SQLSTATE 23503) |
| CHECK |
自定義條件 (如 COL > 0) |
拒絕 INSERT/UPDATE,SQLCODE -545 (SQLSTATE 23513) |
| UNIQUE |
非主鍵唯一性 |
拒絕 INSERT/UPDATE,SQLCODE -803 |
| NOT NULL |
欄位不可為空 |
拒絕 INSERT/UPDATE,SQLCODE -407 (SQLSTATE 23502) |
Control Center 圖形化驗證實戰
場景一:外鍵約束阻擋孤兒記錄
- 表結構:
MODULE (MODULE_ID PK) → PARTICIPANT (PAR_ID FK → MODULE.MODULE_ID)
- 狀態:
MODULE 為空表
- 操作:在 Control Center 開啟
PARTICIPANT 表 →「新增行」→ 輸入任意 PAR_ID → Commit
- 結果:報錯 SQL0530N — 父鍵不存在,引用完整性違規
場景二:檢查約束阻擋負數
- 建表時定義:
CONSTRAINT MID_CHECK CHECK (MODULE_ID >= 0)
- 操作:開啟
MODULE 表 → 新增行 → MODULE_ID = -1 → Commit
- 結果:報錯 — 檢查約束違規,負數被拒
命令列驗證等效操作
-- 外鍵驗證
INSERT INTO PARTICIPANT (PAR_ID) VALUES (999);
-- SQL0530N The insert or update value of the FOREIGN KEY ... is not valid.
-- 檢查約束驗證
INSERT INTO MODULE (MODULE_ID, MODULE_NAME) VALUES (-1, 'TEST');
-- SQL0545N The requested operation is not allowed because a row does not satisfy the check constraint.
約束管理最佳實踐
- 命名規範:
FK_子表_父表、CK_表_業務含義,便於錯誤訊息快速定位
- 啟用/停用:大量載入時
SET INTEGRITY FOR TBL OFF → LOAD → SET INTEGRITY FOR TBL IMMEDIATE CHECKED (驗證現有資料)
- 信賴模式:
SET INTEGRITY FOR TBL IMMEDIATE UNCHECKED 信任載入資料,**極度謹慎使用**
- 效能平衡:OLTP 核心表全約束;數倉暫存表可適度放寬,靠 ETL 流程保證品質