领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

oracle常见报错之无法验证 (约束) - 未找到父项关键字解决办法

nixiaole 2024-12-01 02:05:39 知识剖析 15 ℃

概述

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


思路

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

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

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

/*启用约束:

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

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

禁用约束:

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

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


处理方法

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

Bash
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;

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

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

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

3、分别查看单独的数据

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

4、找到多的行并删除

Bash
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、直接重新执行启用外键的语句,或者删除之前的外键创建新的外键

Bash
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方面的内容,感兴趣的朋友可以关注下~

最近发表
标签列表