代码之家  ›  专栏  ›  技术社区  ›  mcha

插入/更新违反PK约束

  •  0
  • mcha  · 技术社区  · 14 年前

    我有这样一个维度表:

    我的桌子

    pk1  Primary key
    pk2  Primary key
    pk3  Primary key
    col1  
    col2  
    col3  
    ...
    

    然后用一个程序把 合并到 声明:

    MERGE INTO  my_Table dest
    USING 
      ( SELECT <columns>
          FROM <tables>
         WHERE <conditions> ) src
    ON 
      (dest.pk1 = src.pk1 AND dest.pk2 = src.pk2 AND pk3 = src.pk3)
    WHEN     MATCHED THEN UPDATE SET dest.col1 = src.col1 ,
                                     dest.col2 = src.col2 ,
                                     dest.col3 = src.col3
    WHEN NOT MATCHED THEN INSERT (pk1, pk2, pk3, col1, col2, col3) 
                          VALUES (src.pk1, src.pk2, src.pk3, src.col1, src.col2, src.col3);
    

    我的问题是查询 src公司 '返回一些主键相同的行,但它们不是重复的行,例如

     | pk1 | pk2 | pk3 |  col1   | col2       | col3  |
     --------------------------------------------------
     | 100 | abc | x99 | 6000,00 | 01/01/2010 | 50,00 | 
     | 100 | abc | x99 | 0,00    | 01/01/2010 | 30,00 |
     | 110 | rty | b50 | 345,00  | 08/10/2009 | 10,00 |
     | 120 | xyz | y91 | 1200,00 | 13/02/2009 | 12,50 |
     | 120 | xyz | y91 | 1200,00 | 13/02/2009 |  0,00 |
     | 120 | xyz | y91 | 1200,00 | 13/02/2009 |  0,00 |
     | 120 | xyz | y91 | 1200,00 | 13/02/2009 |  0,00 |
    

    所以,当我调用我的程序时,它返回 .

    这个问题的解决办法是什么?我不是这个查询的作者 src 顺便说一句。。。

    如果我需要修改 src公司 (100,abc,x99)

    | pk1 | pk2 | pk3 |  col1   | col2       | col3  |   
     --------------------------------------------------    
    | 100 | abc | x99 | 6000,00 | 01/01/2010 | 80,00 | 
    

    为了pk (120,xyz,y91) 我会:

    | pk1 | pk2 | pk3 |  col1   | col2       | col3  |  
     --------------------------------------------------    
    | 120 | xyz | y91 | 1200,00 | 13/02/2009 | 12,50 |
    

    提前谢谢你的建议。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Erich Kitzmueller    14 年前

    很明显,我们必须做些什么 src 使其返回唯一的主键。如果不太关心表中数据的质量,可以使用聚合并将其更改为

     select pk1, pk2, pk3, max(col1), max(col2), sum(col3)
       from ...
       where ...
       group by pk1, pk2, pk3
    

    但很可能你需要更复杂的处理来理解这些东西。

    编辑:先更改 sum max

        2
  •  0
  •   Hendra Jaya    14 年前

    如果您真的确定没有主键冲突。请尝试检查col1、col2和col3是否没有任何唯一约束。可能唯一约束冲突不是来自主键字段。

    介意和我们分享你的“错误信息”吗?