未找到要求的from关键字oracle_oracle常见报错之无法验证 (约束) - 未找到父项关键字解决办法...

概述

最近在归档某张大表时因需要重建约束,碰到了个ORA-02298类型的报错,这个问题还算比较常见的,这里整理一下一般的处理方法。

9c9026730818687094f57a56e4764687.png

思路

产生ORA-02298错误一般是你要插入的表A里,有外键连接到另一个表B的主键,你在表A的外键列插入的值,在表B的主键列找不到就不能插入。

主要看两表中的数据是否一致,从表中要关联外键的字段中的数据必须包含在主表相关字段的数据内。

这里是启用外键约束的时候需要去校验两边数据是否一致,很明显是不一致,所以就报了以上的错误。

8ef997f6beaa28faf3e3edebf21d6bc2.png

约束命名规范

/*启用约束:

enable( validate) :启用约束,创建索引,对已有及新加入的数据执行约束.

enable novalidate :启用约束,创建索引,仅对新加入的数据强制执行约束,而不管表中的现有数据.

禁用约束:

disable( novalidate):关闭约束,删除索引,可以对约束列的数据进行修改等操作.

disable validate :关闭约束,删除索引,不能对表进行 插入/更新/删除等操作.*/


处理方法

1、 先不验证已有数据的CONSTRANT,加上参数NOVALIDATE

alter table S_SHIP_UNIT_LINE add constraint FK_SSUL_ORL_GID2 foreign key (OR_LINE_GID) references ORDER_RELEASE_LINE (ORDER_RELEASE_LINE_GID) NOVALIDATE;
8b86e6fac5661aaff9951887d8b7eace.png

NOVALIDATE是对之前的数据不做校验,后面新增的数据还是会校验的,因为我是删了数据后去做的,所以这个数据一致性是在允许范围内的,就没有做下面的动作了。

2、首先查看两个表对应起来的数据有多少

select count(*) from S_SHIP_UNIT_LINE t,ORDER_RELEASE_LINE  k where t.OR_LINE_GID= k.ORDER_RELEASE_LINE_GID;

3、分别查看单独的数据

select count(*) from S_SHIP_UNIT_LINE t;select count(*) from ORDER_RELEASE_LINE k;

4、找到多的行并删除

select t.OR_LINE_GID from S_SHIP_UNIT_LINE t where t.OR_LINE_GID not in (select k.ORDER_RELEASE_LINE_GID from ORDER_RELEASE_LINE k);

5、直接重新执行启用外键的语句,或者删除之前的外键创建新的外键

alter table S_SHIP_UNIT_LINE add constraint FK_SSUL_ORL_GID2 foreign key (OR_LINE_GID) references ORDER_RELEASE_LINE (ORDER_RELEASE_LINE_GID)  VALIDATE;

觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

3b402367ddabcd10f1b97b24da47a7cd.gif
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值