由于截断/删除导致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。(过程在第#行失败…)违反主键约束"pk1101AE"无法插入对象"目标"中的重复密钥

我的问题:

  • 当目标表中不存在我要插入的键
  • 先前删除记录是否会导致保留主键?如果是,我能解决这个问题吗
  • 还有别的吗

很明显,我的暂存表有键,而Target表没有。然而插入失败了。

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

如果复制的{user_state, test_state}对中的哪一对进入插入中对您来说无关紧要,那么您可以通过添加一个简单的group by来完全绕过这个问题,如下所示:

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

相关内容

  • 没有找到相关文章

最新更新