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

 

--完

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值