Oracle违反约束数据的workaround
最近为测试做一些数据导入,其中存在一些主子表,由于种种原因,子表有些记录,外键值在主表无记录,导致数据导入过程中,无法创建外键,
Failing sql is:
ALTER TABLE "A" ADD CONSTRAINT "FK_A_REF_B" FOREIGN KEY ("A_ID") REFERENCES "B" ("ID") ENABLE
ORA-39083: Object type REF_CONSTRAINT failed to create with error:
ORA-02298: cannot validate (FK_A_REF_B) - parent keys not found
此时若手工执行,
ALTER TABLE A ADD CONSTRAINT FK_A_REF_B FOREIGN KEY (A_ID) REFERENCES B (ID) ENABLE;
就会提示ORA-02298,
oerr ora 2298
02298, 00000,"cannot validate (%s.%s) - parent keys not found"
*Cause: an alter table validating constraint failed because the table has orphaned child records.
*Action: Obvious
这种数据不规则,难以满足数据完整性要求。此时,可以使用not validate的方式,对历史数据不进行约束控制,而只针对新数据开启验证。
alter table a add constraint fk_a_ref_b foreign key(a_id) references b(id) novalidate;
针对正在修改的数据,以及存在的数据,可以有不同的生效设置,Oracle官方文档的介绍,
下面可以根据rowid,定位A表违规数据,要么删除,要么改造,让其符合约束,进而就可以正常执行。
select * from A where rowid in (select row_id from exceptions);
需要注意的是,exceptions是一张普通堆表,因此存储的数据,需要自行清理,要么执行truncate,要么执行drop。
总结:
1. 针对不规则数据,可以使用alter table ... NOVALIDATE,对历史数据不做约束,只约束新增数据。
2. alter table可以使用exceptions into子句,让非法数据自动记录,异常表exceptions可以使用脚本,也可以自行创建,但需要自行清理,利用这张表可以整理数据,纠正不规则数据。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341