千家信息网

Oracle违反约束数据的workaround

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,最近为测试做一些数据导入,其中存在一些主子表,由于种种原因,子表有些记录,外键值在主表无记录,导致数据导入过程中,无法创建外键,Failing sql is:ALTER TABLE "A" ADD C
千家信息网最后更新 2026年11月03日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可以使用脚本,也可以自行创建,但需要自行清理,利用这张表可以整理数据,纠正不规则数据。

数据 要么 不规则 历史 历史数据 不同 普通 主子 原因 子句 完整性 官方 手工 文档 方式 正在 脚本 过程 存储 定位 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中智农互联网科技 深圳九邦互联网科技有限公司 科技股互联网 互联网中国科技 深圳科技互联网 广州互联网络科技有限公司 奇士达互联网科技 互联网科技大会案例 深圳互联网科技怎么样 青岛中康互联网医疗科技有限公司 互联网科技寓意 互联网系的金融科技公司 科技互联网大厂 四川慕妮娅互联网科技有限公司 群盈汇互联网科技有限公司 雨阳互联网卡科技有限公司 中天科技中国工业互联网 九思连强互联网电子科技有限公司 新氧科技和美国互联网有关系吗 小牛互联网科技有限公司地址 涨乐互联网科技 疫情对互联网科技公司影响 隆华科技工业互联网 互联网科技人工智能实验室 无锡工业互联网科技有限公司 黑云互联网科技有限公司 互联网科技的前景 保山浩联互联网科技有限公司 华人运通互联网科技公司 上海旺乐尼互联网科技有限公司
0