SQL – Oracle XE 10g中的MERGE和ON DELETE CASCADE

简而言之(tl; dr):当试图在MERGE期间删除行时,Oracle 10g似乎忽略外键的ON DELETE CASCADE语句.我想知道这是一个已知的bug,一个功能(显然已经停止在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都有一些>键的行,那么尝试的MERGE将导致ORA-02292,声称违反了Myother_FK约束.
这听起来不合逻辑(我可以使用直接DELETE删除Mydest中的行,但不能使用MERGE删除?),事实上Oracle XE 11g似乎没有.

题:
你知道这是一个已知的bug,还是一个奇怪的功能?或者我错过了什么,也许?到目前为止,搜索互联网并没有多大帮助.

最佳答案 Oracle将其列为10.2.0.3中的错误8268746.它在11.2中修复.该文档不可用于外部链接,但它提供了与上述问题中提供的示例类似的测试用例.解决方法是不使用merge语句(或升级到11.2).

点赞