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

DB2 約束驗證實戰:外鍵與檢查約束阻擋無效資料

     編輯:DB2 教學

約束類型與驗證邏輯

約束類型用途違規時行為
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 圖形化驗證實戰

場景一:外鍵約束阻擋孤兒記錄

  1. 表結構:MODULE (MODULE_ID PK) → PARTICIPANT (PAR_ID FK → MODULE.MODULE_ID)
  2. 狀態:MODULE 為空表
  3. 操作:在 Control Center 開啟 PARTICIPANT 表 →「新增行」→ 輸入任意 PAR_ID → Commit
  4. 結果:報錯 SQL0530N — 父鍵不存在,引用完整性違規

場景二:檢查約束阻擋負數

  1. 建表時定義:CONSTRAINT MID_CHECK CHECK (MODULE_ID >= 0)
  2. 操作:開啟 MODULE 表 → 新增行 → MODULE_ID = -1 → Commit
  3. 結果:報錯 — 檢查約束違規,負數被拒

命令列驗證等效操作

-- 外鍵驗證
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 流程保證品質
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved