INSERT / UPDATE违反了PK约束

时间:2010-08-27 11:35:19

标签: sql oracle plsql

我有一个像这样的维度表:

my_Table

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

并使用过程使用 MERGE INTO 语句填充此表:

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我应该为pk (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 个答案:

答案 0 :(得分:1)

很明显,必须使用src完成某些操作才能使其返回唯一的主键。如果您不太关心表格中数据的质量,可以使用聚合并更改它,例如到

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

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

编辑:先将sum更改为max,以反映问题中的修改

答案 1 :(得分:0)

如果您确定没有主键冲突。请尝试检查col1,col2和col3是否没有任何唯一约束。也许唯一约束违规不是来自主键字段。

请注意与我们分享您的“错误消息”?

相关问题