自引用表上的MERGE约束错误

时间:2019-01-15 12:49:16

标签: sql oracle merge oracle12c

MERGE引发错误

ORA-02291: integrity constraint violated-parent key not found

在插入自引用表中。 如果我一点也不更改查询,它将起作用。

我做错什么了吗

执行顺序:

  1. 准备工作
  2. 第一个MERGE查询(将不起作用)
  3. 第二个MERGE查询(将可用)

MERGE查询中列的顺序无关紧要。您也可以先运行第二个MERGE。

如果您想重新开始测试,请从DROP TABLE TGR开始。

先做一些准备工作

DROP TABLE SRC;
CREATE TABLE SRC (
  ID VARCHAR(20) PRIMARY KEY,
  PARENT VARCHAR(20)
);

INSERT INTO SRC SELECT '1', null FROM DUAL;
INSERT INTO SRC SELECT '2', '1' FROM DUAL;

DROP TABLE TRG;
CREATE TABLE TRG (
  ID VARCHAR(20) PRIMARY KEY,
  PARENT VARCHAR(20),
  CONSTRAINT FK2 FOREIGN KEY(PARENT) REFERENCES TRG(ID)
);

这不起作用:

MERGE INTO TRG t USING(
  SELECT PARENT, ID FROM SRC
) s ON (t.ID=s.ID)
WHEN NOT MATCHED THEN INSERT(ID,PARENT) VALUES (s.ID,s.PARENT);

但这会起作用。

MERGE INTO TRG t USING(
  SELECT ID, PARENT FROM SRC
) s ON (t.ID=s.ID)
WHEN NOT MATCHED THEN INSERT(ID,PARENT) VALUES (s.ID,s.PARENT);

如果将这些列的数据类型更改为NUMBER,它将起作用。

DROP TABLE SRC;
CREATE TABLE SRC (
  ID NUMBER PRIMARY KEY,
  PARENT NUMBER
);

INSERT INTO SRC SELECT 1, null FROM DUAL;
INSERT INTO SRC SELECT 2, 1 FROM DUAL;

DROP TABLE TRG;
CREATE TABLE TRG (
  ID NUMBER PRIMARY KEY,
  PARENT NUMBER,
  CONSTRAINT FK2 FOREIGN KEY(PARENT) REFERENCES TRG(ID)
);

MERGE INTO TRG t USING(
  SELECT PARENT, ID FROM SRC
) s ON (t.ID=s.ID)
WHEN NOT MATCHED THEN INSERT(ID,PARENT) VALUES (s.ID,s.PARENT);

编辑: 忘了告诉我:我正在使用12c

0 个答案:

没有答案