由于截断/删除导致SQL Server主键冲突?

时间:2012-01-30 00:10:17

标签: sql-server-2008 primary-key truncate

我有一组临时表,在插入目标表之前,我接受数据,清理并清理它们。目标表有一个主键约束,我插入的是主键。

在插入之前,我检查目标表中是否缺少主键。我根据主键的缺席只插入不在目标表中的记录:

INSERT INTO Target
    SELECT 
        primKey
        , user_state
        , test_state
    FROM
        myStagingTable3

到目前为止,stagingTable3只有使用以下where子句在目标表中不存在的数据:

WHERE
        primKey not in (Select primKey from Target)

不知何故,我收到了主键违规错误:

  

Msg 2627,等级14,状态1.(程序在##行失败)   违反主键约束'pk1101AE'。无法插入   对象'Target'中的重复键

我的问题:

  • 在什么条件下可能发生主键违规 我要插入的键不存在于目标表中?
  • 先前删除记录会导致主键被保留吗?如果是这样, 我可以以某种方式解决这个问题吗?
  • 别的什么?

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

1 个答案:

答案 0 :(得分:2)

这是因为您的登台表包含多个具有相同primKey值的行。

如果重复的{user_state, test_state}对中的group by对与插入内容无关,则可以通过添加简单INSERT INTO Target (SELECT primKey , MAX(user_state) , MAX(test_state) FROM myStagingTable3 GROUP BY primKey) 完全绕过此问题,如下所示:

{{1}}