总之 (tl;dr): 当试图在 MERGE
期间删除行时,Oracle 10g 好像忽略了ON DELETE CASCADE
外键的语句。我想知道这是一个已知的错误,一个功能(显然在 11g 中停止了),还是什么。
更详细:
在我看来,在 Oracle 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
约束。这对我来说听起来不合逻辑(我可以使用直接的
Mydest
删除 DELETE
中的行,但不能使用 MERGE
?),事实上,Oracle XE 11g 似乎不会发生这种情况。问题:
你知道这是一个已知的错误,还是一个奇怪的功能?或者我错过了什么,也许?到目前为止,在互联网上搜索并没有多大帮助。
最佳答案
Oracle 在 10.2.0.3 中将其列为错误 8268746。它已在 11.2 中修复。该文档不可用于外部链接,但它提供了一个类似于上述问题中提供的示例的测试用例。解决方法是不使用合并语句(或升级到 11.2)。
关于sql - Oracle XE 10g 中的 MERGE 和 ON DELETE CASCADE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9957146/