概述
当表中设置了约束时,使用 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
--完
最后
以上就是奋斗狗为你收集整理的DB2 INTEGRITY 完整性检查的全部内容,希望文章能够帮你解决DB2 INTEGRITY 完整性检查所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复