Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 自引用表上的合并约束错误_Sql_Oracle_Merge_Oracle12c - Fatal编程技术网

Sql 自引用表上的合并约束错误

Sql 自引用表上的合并约束错误,sql,oracle,merge,oracle12c,Sql,Oracle,Merge,Oracle12c,MERGE正在引发一个错误 ORA-02291: integrity constraint violated-parent key not found 插入到自引用表中时。 如果我用“无所谓”稍微更改一下查询,它就会工作 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); D

MERGE正在引发一个错误

ORA-02291: integrity constraint violated-parent key not found
插入到自引用表中时。 如果我用“无所谓”稍微更改一下查询,它就会工作

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);
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);
我做错什么了吗

执行命令:

  • 准备材料
  • 第一个合并查询(不起作用)
  • 第二个合并查询(将起作用)
  • 合并查询中列的顺序并不重要。您还可以在第一次合并之前运行第二次合并

    如果要重新启动测试,请从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);
    
    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);
    
    如果您将这些列的数据类型更改为NUMBER,它将起作用

    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);
    
    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

    您是否尝试过在合并查询中首先对数据进行排序
    select parent,id from src order by parent
    我在Oracle11g上试过,也在Oracle11g上试过,效果很好。所以这在12c中应该是个问题。在帖子中添加了此提示。问题是为什么我需要运行两次。在OraDocs中,他们说约束将在MERGE语句之后被检查。