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

DB2 驗證約束實戰演練:外鍵與檢查約束的 Control Center 驗證流程

     編輯:DB2 教學

約束定義完成後,必須透過實際資料操作驗證其生效情況。本文以 IBM Data Studio / Control Center 為操作介面,示範外鍵引用完整性與 CHECK 約束的驗證步驟、錯誤訊息解讀與常見情境。

驗證環境準備


-- 建立父表:模組主檔
CREATE TABLE module (
  module_id  INTEGER NOT NULL PRIMARY KEY,
  module_name VARCHAR(50) NOT NULL,
  CONSTRAINT mid_chk CHECK (module_id >= 0)
);

-- 建立子表:參與者明細(含外鍵)
CREATE TABLE participant (
  par_id     INTEGER NOT NULL PRIMARY KEY,
  module_id  INTEGER NOT NULL,
  par_name   VARCHAR(50),
  CONSTRAINT fk_module FOREIGN KEY (module_id) REFERENCES module(module_id)
);

情境一:外鍵引用完整性驗證

前置條件

MODULE 表為空,PARTICIPANT 表嘗試插入 module_id = 100。

操作步驟

  1. 開啟 Control Center → 右鍵 PARTICIPANT 表 → Open
  2. 點擊 Add Row 新增列
  3. 輸入:PAR_ID=1, MODULE_ID=100, PAR_NAME='Test'
  4. 點擊 Commit 提交

預期結果


SQL0530N  The insert or update value of the FOREIGN KEY "FK_MODULE" 
          is not equal to any value of the parent key of the parent table. 
          SQLSTATE=23503

解讀:父表 MODULE 中不存在 MODULE_ID=100,外鍵約束生效阻擋寫入。

修正驗證

  1. 先在 MODULE 插入 MODULE_ID=100, MODULE_NAME='Base Module'
  2. 再次插入 PARTICIPANT 相同資料 → 成功

情境二:CHECK 約束驗證

前置條件

MODULE 表定義 CONSTRAINT mid_chk CHECK (module_id >= 0)。

操作步驟

  1. 開啟 MODULE 表 → Open → Add Row
  2. 輸入:MODULE_ID=-1, MODULE_NAME='Invalid'
  3. 點擊 Commit

預期結果


SQL0545N  The requested operation is not allowed because a row does not 
          satisfy the check constraint "MID_CHK". SQLSTATE=23513

解讀:MODULE_ID=-1 違反 module_id >= 0 條件,CHECK 約束生效。

命令列驗證替代方案

無 GUI 環境時,使用 CLP 同樣可驗證:


-- 外鍵驗證
db2 "insert into participant values (1, 100, 'Test')"
-- SQL0530N

db2 "insert into module values (100, 'Base Module')"
db2 "insert into participant values (1, 100, 'Test')"
-- 成功

-- CHECK 驗證
db2 "insert into module values (-1, 'Invalid')"
-- SQL0545N

進階驗證:SET INTEGRITY 批次檢查

大量載入資料後,可一次性驗證所有約束:


-- 1. 停用約束檢查(載入階段)
db2 "set integrity for participant, module off"

-- 2. 大量載入(IMPORT/LOAD/INSERT)
db2 "import from data.ixf of ixf insert into participant"

-- 3. 重新啟用並立即檢查
db2 "set integrity for participant, module immediate checked"

-- 4. 查看違規記錄(可選,指定例外表)
db2 "set integrity for participant immediate checked 
     for exception in participant use admin.participant_exc"

常見錯誤代碼速查表

SQLCODESQLSTATE約束類型中文說明
SQL0530N23503FOREIGN KEY父鍵值不存在
SQL0531N23504FOREIGN KEY父記錄被引用時嘗試刪除(RESTRICT)
SQL0532N23505PRIMARY KEY / UNIQUE重複鍵值
SQL0545N23513CHECK違反檢查條件
SQL0542N42831PRIMARY KEY主鍵欄位不得為 NULL

驗證清單(上線前必做)

  1. [ ] 所有父表先於子表建立
  2. [ ] 外鍵欄位型態、長度、編碼與父表主鍵完全一致
  3. [ ] CHECK 條件涵蓋業務邊界值(0、負數、最大值、空字串)
  4. [ ] NOT ENFORCED 約束已排程定期 SET INTEGRITY CHECKED
  5. [ ] 例外表已建立供違規資料導出分析
  6. [ ] 應用層錯誤處理已對應上述 SQLCODE 給予使用者友善提示
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved