sql - Oracle XE 10g 中的 MERGE 和 ON DELETE CASCADE

标签 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有一些具有 >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/

相关文章:

sql - 将 Excel 数据导入 PostgreSQL 9.3

sql - 授予对所有表/PostgreSQL 的自动选择

sql - 在表格中显示约束

sql - 需要将值添加到现有的行和列中

c# - 我如何在oracle的sql段中使用参数两次

mysql - SQL - SELECT 中的 SELECT

php - 从外部脚本访问 Joomla 2.5 以通过 id 获取文章

java - 获取 Tomcat 中数据库资源上 Activity/失效连接的计数

linux - 无法以 root 用户身份启动 Oracle 监听器

oracle - 如何检查哪些模式已被授予对 Oracle 对象的 EXECUTE 权限?