溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Oracle違反約束數(shù)據(jù)的workaround

發(fā)布時(shí)間:2020-08-11 16:56:12 來源:ITPUB博客 閱讀:113 作者:bisal 欄目:關(guān)系型數(shù)據(jù)庫

最近為測(cè)試做一些數(shù)據(jù)導(dǎo)入,其中存在一些主子表,由于種種原因,子表有些記錄,外鍵值在主表無記錄,導(dǎo)致數(shù)據(jù)導(dǎo)入過程中,無法創(chuàng)建外鍵,

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


此時(shí)若手工執(zhí)行,

ALTER TABLE A ADD CONSTRAINT FK_A_REF_B FOREIGN KEY (A_ID) REFERENCES B (ID) ENABLE;


就會(huì)提示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


這種數(shù)據(jù)不規(guī)則,難以滿足數(shù)據(jù)完整性要求。此時(shí),可以使用not validate的方式,對(duì)歷史數(shù)據(jù)不進(jìn)行約束控制,而只針對(duì)新數(shù)據(jù)開啟驗(yàn)證。

alter table a add constraint fk_a_ref_b foreign key(a_id) references b(id) novalidate;


針對(duì)正在修改的數(shù)據(jù),以及存在的數(shù)據(jù),可以有不同的生效設(shè)置,Oracle官方文檔的介紹,


下面可以根據(jù)rowid,定位A表違規(guī)數(shù)據(jù),要么刪除,要么改造,讓其符合約束,進(jìn)而就可以正常執(zhí)行。

select * from A where rowid in (select row_id from exceptions);


需要注意的是,exceptions是一張普通堆表,因此存儲(chǔ)的數(shù)據(jù),需要自行清理,要么執(zhí)行truncate,要么執(zhí)行drop。



總結(jié):

1. 針對(duì)不規(guī)則數(shù)據(jù),可以使用alter table ... NOVALIDATE,對(duì)歷史數(shù)據(jù)不做約束,只約束新增數(shù)據(jù)。

2. alter table可以使用exceptions into子句,讓非法數(shù)據(jù)自動(dòng)記錄,異常表exceptions可以使用腳本,也可以自行創(chuàng)建,但需要自行清理,利用這張表可以整理數(shù)據(jù),糾正不規(guī)則數(shù)據(jù)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI