約束定義完成後,必須透過實際資料操作驗證其生效情況。本文以 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。
PARTICIPANT 表 → OpenPAR_ID=1, MODULE_ID=100, PAR_NAME='Test'
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,外鍵約束生效阻擋寫入。
MODULE 插入 MODULE_ID=100, MODULE_NAME='Base Module'PARTICIPANT 相同資料 → 成功MODULE 表定義 CONSTRAINT mid_chk CHECK (module_id >= 0)。
MODULE 表 → Open → Add RowMODULE_ID=-1, MODULE_NAME='Invalid'
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
大量載入資料後,可一次性驗證所有約束:
-- 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"
| SQLCODE | SQLSTATE | 約束類型 | 中文說明 |
|---|---|---|---|
| SQL0530N | 23503 | FOREIGN KEY | 父鍵值不存在 |
| SQL0531N | 23504 | FOREIGN KEY | 父記錄被引用時嘗試刪除(RESTRICT) |
| SQL0532N | 23505 | PRIMARY KEY / UNIQUE | 重複鍵值 |
| SQL0545N | 23513 | CHECK | 違反檢查條件 |
| SQL0542N | 42831 | PRIMARY KEY | 主鍵欄位不得為 NULL |
SET INTEGRITY CHECKED