2012-01-30 21 views
1

我有一套临时表,我接受数据,擦洗和清理它们,然后再插入到目标表中。目标表有一个主键约束,我插入的是主键。由于截断/删除SQL Server主键违例?

我在插入之前检查目标表中是否存在主键。我插入只在目标表中没有记录的基础上,主键的缺席:

INSERT INTO Target 
    SELECT 
     primKey 
     , user_state 
     , test_state 
    FROM 
     myStagingTable3 

至此,该stagingTable3只有使用下面的where子句中不存在目标表中的数据:

WHERE 
     primKey not in (Select primKey from Target) 

不知怎的,我得到一个主键冲突错误:

消息2627,级别14,状态1(步骤在行#失败...) 违反主键的常量raint'pk1101AE'。不能插入对象“目标”

我的问题 重复键:

  • 下可以当 关键,我想插入不存在于目标表中的主键冲突发生什么情况?
  • 可以事先删除记录导致主键被保留?如果是这样, 可以以某种方式解决这个问题吗?
  • 别的东西?

这很明显,我的登台表有钥匙,而目标表没有。然而插入失败。

+0

我要补充一点,我阅读这篇文章:http://stackoverflow.com/questions/5278588/violation-of-primary-key-constraint-sql-error删除/截断问题很有趣。只是不知道如何解决它。这种小菜。谢谢。 – user991945 2012-01-30 00:12:17

+0

最有可能您的登台表包含'primKey'的多个值。 – dasblinkenlight 2012-01-30 00:20:41

+0

嗯,我只是检查了......这是真的......它确实有primKey的多个值。这意味着第二个关键值是导致错误的原因,所以整个事情都保留下来并且事务被回滚。如果我不能清除重复项,我可能会在这里查看MERGE声明。这样,我可以在插入后更新。总是检查简单的东西 – user991945 2012-01-30 01:24:35

回答

2

发生这种情况是因为您的登台表包含具有相同primKey值的多行。

如果不要紧,你该复制者之间{user_state, test_state}对使它到插入,你完全可以通过添加一个简单的group by,这样绕过这个问题:

INSERT INTO Target 
    (SELECT 
     primKey 
    , MAX(user_state) 
    , MAX(test_state) 
    FROM 
     myStagingTable3 
    GROUP BY primKey)