作者:admin 日期:2023-10-17 瀏覽: 次
oracle常見(jiàn)報(bào)錯(cuò)之無(wú)法驗(yàn)證 (約束)
最近在歸檔某張大表時(shí)因需要重建約束,碰到了個(gè)ORA-02298類型的報(bào)錯(cuò),這個(gè)問(wèn)題還算比較常見(jiàn)的,這里整理一下一般的處理方法。
產(chǎn)生ORA-02298錯(cuò)誤一般是你要插入的表A里,有外鍵連接到另一個(gè)表B的主鍵,你在表A的外鍵列插入的值,在表B的主鍵列找不到就不能插入。
主要看兩表中的數(shù)據(jù)是否一致,從表中要關(guān)聯(lián)外鍵的字段中的數(shù)據(jù)必須包含在主表相關(guān)字段的數(shù)據(jù)內(nèi)。
這里是啟用外鍵約束的時(shí)候需要去校驗(yàn)兩邊數(shù)據(jù)是否一致,很明顯是不一致,所以就報(bào)了以上的錯(cuò)誤。
約束命名規(guī)范
/*啟用約束:
enable( validate) :啟用約束,創(chuàng)建索引,對(duì)已有及新加入的數(shù)據(jù)執(zhí)行約束.
enable novalidate :啟用約束,創(chuàng)建索引,僅對(duì)新加入的數(shù)據(jù)強(qiáng)制執(zhí)行約束,而不管表中的現(xiàn)有數(shù)據(jù).
禁用約束:
disable( novalidate):關(guān)閉約束,刪除索引,可以對(duì)約束列的數(shù)據(jù)進(jìn)行修改等操作.
disable validate :關(guān)閉約束,刪除索引,不能對(duì)表進(jìn)行 插入/更新/刪除等操作.*/
1、 先不驗(yàn)證已有數(shù)據(jù)的CONSTRANT,加上參數(shù)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是對(duì)之前的數(shù)據(jù)不做校驗(yàn),后面新增的數(shù)據(jù)還是會(huì)校驗(yàn)的,因?yàn)槲沂莿h了數(shù)據(jù)后去做的,所以這個(gè)數(shù)據(jù)一致性是在允許范圍內(nèi)的,就沒(méi)有做下面的動(dòng)作了。
2、首先查看兩個(gè)表對(duì)應(yīng)起來(lái)的數(shù)據(jù)有多少
select count(*) from S_SHIP_UNIT_LINE t,ORDER_RELEASE_LINE
k where t.OR_LINE_GID= k.ORDER_RELEASE_LINE_GID;
3、分別查看單獨(dú)的數(shù)據(jù)
select count(*) from S_SHIP_UNIT_LINE t;
宿遷數(shù)據(jù)恢復(fù)select count(*) from ORDER_RELEASE_LINE k;
揚(yáng)州數(shù)據(jù)恢復(fù)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、直接重新執(zhí)行啟用外鍵的語(yǔ)句,或者刪除之前的外鍵創(chuàng)建新的外鍵
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;
覺(jué)得有用的朋友多幫忙轉(zhuǎn)發(fā)哦!后面會(huì)分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注下~