简而言之(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
都有一些&gt;键的行,那么尝试的MERGE将导致ORA-02292,声称违反了Myother_FK
约束。
这对我来说听起来不合逻辑(我可以使用直接Mydest
删除DELETE
中的行,但不能使用MERGE
删除行?)实际上Oracle XE 11g似乎没有这样做
问题: 你知道这是一个已知的bug,还是一个奇怪的功能?或者我错过了什么,也许?到目前为止,搜索互联网并没有多大帮助。
答案 0 :(得分:2)
Oracle将其列为10.2.0.3中的错误8268746。它在11.2中修复。该文档不可用于外部链接,但它提供了与上述问题中提供的示例类似的测试用例。解决方法是不使用merge语句(或升级到11.2)。