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

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

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、余干網(wǎng)站維護、網(wǎ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

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

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

就會提示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ù)完整性要求。此時,可以使用not validate的方式,對歷史數(shù)據(jù)不進行約束控制,而只針對新數(shù)據(jù)開啟驗證。

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

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

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

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

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

總結(jié):

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

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

分享文章:Oracle違反約束數(shù)據(jù)的workaround
文章出自:http://bm7419.com/article44/geiche.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、營銷型網(wǎng)站建設(shè)網(wǎng)站制作、、品牌網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)