簡而言之(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)
如果同時Mydest
和Myother
曾與> 10鍵一些行,企圖MERGE然後會導致ORA-02292,聲稱違反了Myother_FK
約束。 這聽起來對我來說不合邏輯(我可以使用直接DELETE
從Mydest
刪除行,但不能用MERGE
?),事實上,Oracle XE 11g似乎沒有發生這種情況。
問題: 你知道這是一個已知的bug還是一個奇怪的特性?或者我錯過了什麼,也許?到目前爲止,搜索互聯網並沒有多大幫助。
好的。我認爲這是10g中的一個bug。轉載自己在Oracle 10.2.0.4上的測試用例。已驗證正在使用11.2.0.1。 – 2012-04-02 06:12:53
Oracle在10.2.0.3中將其列爲bug 8268746,在11.2中修復。解決方法是不要使用合併:) – Glenn 2012-04-03 23:04:32
來吧,@Glenn,把這作爲一個答案! – 2012-04-10 17:30:47