最近为测试做一些数据导入,其中存在一些主子表,由于种种原因,子表有些记录,外键值在主表无记录,导致数据导入过程中,无法创建外键,
sql是失败:
ALTER TABLE“A"添加约束“FK_A_REF_B"外键(“A_ID")引用“B"(“ID")启用
ora - 39083:对象类型REF_CONSTRAINT未能创建错误:
ora - 02298:不能验证(FK_A_REF_B)——父母钥匙不见了
引用>
此时若手工执行,
ALTER TABLE添加约束FK_A_REF_B外键(A_ID)引用B (ID)启用;
引用>
就会提示ora - 02298,
oerr奥拉2298
引用>
02298年,00000年,“无法验证(% s % s) -父键不是found"
*原因:alter table验证约束失败,因为表有孤立子记录。
*行动:明显
这种数据不规则,难以满足数据完整性要求。此时,可以使用不验证的方式,对历史数据不进行约束控制,而只针对新数据开启验证。
alter table添加约束fk_a_ref_b外键(a_id)引用b (id)已经;
引用>
针对正在修改的数据,以及存在的数据,可以有不同的生效设置,甲骨文官方文档的介绍,
下面可以根据rowid,定一个表位违规数据,要么删除,要么改造,让其符合约束,进而就可以正常执行。
select *, rowid的(从例外选择row_id);
引用>
需要注意的是,例外是一张普通堆表,因此存储的数据,需要自行清理,要么执行截断,要么执行下降。
总结:
1. 针对不规则数据,可以使用alter table……已经,对历史数据不做约束,只约束新增数据。
2. alter table可以使用异常到子句,让非法数据自动记录,异常表异常可以使用脚本,也可以自行创建,但需要自行清理,利用这张表可以整理数据,纠正不规则数据。
甲骨文违反约束数据的解决方案