如何合并查询与相同列匹配会导致主键违规?

时间:2017-09-01 10:36:45

标签: oracle

我手头有一个棘手的问题,合并查询如下: -

MERGE INTO table_destination D USING table_source S 
  ON (D.id = S.id AND D.name_s = S.name_s AND D.seqno = S.seqno AND D.type_s = S.type_s) 
  WHEN NOT MATCHED THEN INSERT (D.class_v, D.id, D.name_s, D.seqno, D.VALID, D.IFSC_CODE, D.CREATOR, D.APPROVER, D.type_s) VALUES (S.class_v, S.id, S.name_s, S.seqno, S.VALID, S.IFSC_CODE, S.CREATOR, S.APPROVER,S.type_s) 
  WHEN MATCHED THEN UPDATE SET D.VALID = S.VALID

提供主键违规 - unique constraint (schema_1.TBL_BRANCH_PK1) violated

目标表的DDL如下: -

 CREATE TABLE table_destination
   (    "id" VARCHAR2(3 BYTE), 
    "name_s" VARCHAR2(3 BYTE), 
    "seqno" VARCHAR2(3 BYTE), 
    "NAME" VARCHAR2(50 BYTE), 
    "type_s" VARCHAR2(3 BYTE) NOT NULL ENABLE, 
    "IFSC_CODE" VARCHAR2(11 BYTE), 
    "VALID" NUMBER(1,0), 
    "CREATOR" VARCHAR2(22 BYTE), 
    "APPROVER" VARCHAR2(22 BYTE), 
     CONSTRAINT "TBL_BRANCH_PK1" PRIMARY KEY ("id", "name_s", "seqno", "type_s")
  );

显然,违反的Pk包含在合并查询中检查匹配的列。

另外需要注意的是,此查询可以同时从两个会话运行,但这不应该是一个问题,因为合并必须在实际更新之前获取该行的锁定。请帮忙。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您确实已对目标表进行约束,但源表中没有关于约束的信息。如果在源表中有两个具有相同键的记录,则会尝试插入并且约束失败。

System.IO.File.SetAttributes(strFileFullPath, FileAttributes.Normal);
System.IO.File.Delete(strFileFullPath);