DB2 INTEGRITY 完整性檢查
阿新 • • 發佈:2019-01-29
當表中設定了約束時,使用 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
--完