1. 程式人生 > >DB2 INTEGRITY 完整性檢查

DB2 INTEGRITY 完整性檢查

    當表中設定了約束時,使用 import 匯入資料後,資料可以正常訪問。但是若使用 load 裝載資料,表會處於"設定完整性暫掛"狀態,無法查詢表中資料,使用 SET INTEGRITY 語句可以使表脫離 "設定完整性暫掛"狀態。

如下舉例

1、首先,建立約束表


CREATE TABLE AAA (
	A_1 VARCHAR(100),
	A_2 VARCHAR(100),
	A_3 int
);

alter table aaa
	add constraint chk_a3 check(a_3 <=10) ENFORCED ENABLE QUERY OPTIMIZATION
;

reorg table a.aaa;
runstats on table a.aaa and indexes all;

注:在增加約束時,增加了兩個選項。

第一個選項是 NOT ENFORCED,它建議 DB2 在插入或更新資料時不強制檢查本列。也就是說,NOT ENFORCED 違反約束的資料也可以成功插入或修改;ENFORCED 違反約束的資料不能插入或修改,是預設值。

第二個選項是 ENABLE QUERY OPTIMIZATION,DB2 在對該表執行 SELECT 語句時使用它。指定該值時,DB2 將在查詢 SQL 時使用約束中的資訊。也就是說,當表中有違反約束時,若使用 約束欄位 過濾資料時,當 ENABLE QUERY OPTIMIZATION 時,說明查詢時受約束控制;當 DISABLE QUERY OPTIMIZATION 時,說明查詢時不受約束控制。 另外,全表查詢時,能夠查出違反約束的資料。

2、使用 load 匯入資料


aaa.del 檔案內容:
1,2,3
4,5,6
7,8,13

匯入語句:
load client from 'e:\aaa.del' of del 
replace into aaa
nonrecoverable
;

查詢資料:
select * 
from aaa
;

報錯如下:
The table is in Check Pending state. The integrity of the table is not enforced and the content of the table may be invalid. 

注:若在建立約束時,使用 NOT ENFORCED,則使用 LOAD 匯入資料後,表狀態是正常,不會處於 "設定完整性暫掛"狀態。

alter table aaa
	add constraint chk_a3 check(a_3 <=10) NOT ENFORCED ENABLE QUERY OPTIMIZATION
;

3、當表狀態處於 "設定完整性暫掛"狀態時,使用 SET INTEGRITY 有2種處理:一種是忽略約束,並在目的表中保留違反約束的資料;另一種是立即進行約束檢查,並將違反約束的資料移入 異常表(在目標表的基礎上增加兩個欄位,型別分別是 timestamp、 clob)。

(1)、忽略約束

set integrity  for aaa check immediate unchecked;

執行完成後,表狀態變為正常,並且違反約束的資料仍然存在。

(2)、約束檢查


--建立異常表

create table aaa_exp like aaa;

--異常表增加 時間 和 資訊 欄位

alter table aaa
	add column tsm timestamp
	add column msg clob
;

reorg table whdw.aaa;
runstats on table whdw.aaa and indexes all;

--執行約束檢查

set integrity  for aaa immediate checked for exception in whdw.aaa use aaa_exp;

--查詢目標表
select * 
from aaa
;
--查詢結果
A_1	A_2	A_3
1		2		3
4		5		6

--查詢異常表
select * 
from aaa_exp
;
--查詢結果
A_1	A_2	A_3	TSM									MSG
7		8		13	2018/10/17 1:26:43	00001K00015A.AAA.CHK_A3

--完