Oracle XE 10g中的MERGE和ON DELETE CASCADE

时间:2012-03-31 15:22:51

标签: sql oracle oracle10g oracle-xe

简而言之(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)

如果MydestMyother都有一些&gt;键的行,那么尝试的MERGE将导致ORA-02292,声称违反了Myother_FK约束。 这对我来说听起来不合逻辑(我可以使用直接Mydest删除DELETE中的行,但不能使用MERGE删除行?)实际上Oracle XE 11g似乎没有这样做

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

1 个答案:

答案 0 :(得分:2)

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