最近在归档某张大表时因需要重建约束,碰到了个ORA-02298类型的报错,这个问题还算比较常见的,这里整理一下一般的处理方法。
产生ORA-02298错误一般是你要插入的表A里,有外键连接到另一个表B的主键,你在表A的外键列插入的值,在表B的主键列找不到就不能插入。
主要看两表中的数据是否一致,从表中要关联外键的字段中的数据必须包含在主表相关字段的数据内。
这里是启用外键约束的时候需要去校验两边数据是否一致,很明显是不一致,所以就报了以上的错误。
约束命名规范
/*启用约束:
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;
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;