2012-03-31 123 views
4

簡而言之(t1; dr):當試圖在MERGE期間刪除行時,Oracle 10g似乎忽略用於外鍵的ON DELETE CASCADE語句。我想知道這是一個已知的錯誤,一個功能(顯然在11g中停用),或者是什麼。在Oracle XE 10g中MERGE和ON DELETE CASCADE

更詳細地說:
在我看來,在甲骨文XE 10g中,試圖將MERGE語句中刪除表中的行導致了ORA-02292錯誤(違反參照完整性)每當有一個外鍵引用合併的目標表,即使在外鍵約束中指定了ON DELETE CASCADE也是如此。 例如,假設我創建三個表

CREATE TABLE Mysource(
    MykeyS NUMBER, 
    MystringS VARCHAR2(10), 
    CONSTRAINT Mysource_PK PRIMARY KEY(MykeyS) ENABLE 
); 

CREATE TABLE Mydest(
    MykeyD NUMBER, 
    MystringD VARCHAR2(10), 
    CONSTRAINT Mydest_PK PRIMARY KEY(MykeyD) ENABLE 
); 

CREATE TABLE Myother(
    Mykey NUMBER, 
    Mydate DATE, 
    CONSTRAINT Myother_FK FOREIGN KEY(Mykey) 
    REFERENCES Mydest(MykeyD) ON DELETE CASCADE ENABLE 
); 

,並插入在其中的一些數據,然後嘗試

MERGE INTO Mydest D 
USING Mysource S 
ON (D.MykeyD=S.MykeyS) 
WHEN MATCHED THEN 
UPDATE SET D.MystringD = S.MystringS 
DELETE WHERE (S.MykeyS > 10) 
WHEN NOT MATCHED THEN 
INSERT (MykeyD, MystringD) 
VALUES (S.MykeyS, S.MystringS) 
WHERE (S.MykeyS <= 10) 

如果同時MydestMyother曾與> 10鍵一些行,企圖MERGE然後會導致ORA-02292,聲稱違反了Myother_FK約束。 這聽起來對我來說不合邏輯(我可以使用直接DELETEMydest刪除行,但不能用MERGE?),事實上,Oracle XE 11g似乎沒有發生這種情況。

問題: 你知道這是一個已知的bug還是一個奇怪的特性?或者我錯過了什麼,也許?到目前爲止,搜索互聯網並沒有多大幫助。

+1

好的。我認爲這是10g中的一個bug。轉載自己在Oracle 10.2.0.4上的測試用例。已驗證正在使用11.2.0.1。 – 2012-04-02 06:12:53

+2

Oracle在10.2.0.3中將其列爲bug 8268746,在11.2中修復。解決方法是不要使用合併:) – Glenn 2012-04-03 23:04:32

+1

來吧,@Glenn,把這作爲一個答案! – 2012-04-10 17:30:47

回答

2

Oracle在10.2.0.3中將其列爲bug 8268746。它在11.2中被修復。該文檔不可用於外部鏈接,但它提供了與上述問題中提供的示例類似的測試用例。解決方法是不使用合併語句(或升級到11.2)。

+0

再次感謝! _不可用於外部鏈接_是否意味着沒有「官方」和可驗證的來源? – fudo 2012-04-11 09:05:16

+1

@fudo如果您有支持合同,您可以登錄metalink.oracle.com並搜索他們的錯誤數據庫。放入bug數,你會發現它。但是您需要登錄才能訪問該頁面。 – Glenn 2012-04-11 10:45:59

+0

呃......我有一個Oracle登錄名(我必須創建它才能下載Oracle XE 11g),但我認爲我沒有_support contract_。不管怎麼說,還是要謝謝你 :) – fudo 2012-04-16 10:12:56