【问题标题】:SQL Server Primary key violation due to truncate/delete?由于截断/删除导致 SQL Server 主键冲突?
【发布时间】:2012-01-30 00:10:16
【问题描述】:

我有一组暂存表,我在其中接受数据、清理和清理它们,然后再插入目标表。目标表有一个主键约束,我插入的是一个主键。

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

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”。无法插入 对象“目标”中的重复键

我的问题:

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

很明显,我的临时表有键,而目标表没有。然而插入失败。

【问题讨论】:

  • 我应该补充一点,我读了这篇文章:stackoverflow.com/questions/5278588/… 删除/截断问题很有趣。只是不知道如何解决它。在这方面有点菜鸟。谢谢。
  • 您的临时表很可能包含多个 primKey 值。
  • 嗯,我刚刚检查过......这是真的......它确实有多个primKey值。这意味着 SECOND 键值是导致错误的原因,因此整个事情都被保释并且事务被回滚。如果我不能清除重复项,我可能会在这里查看 MERGE 语句。这样,我也可以在插入后更新。总是检查简单的东西

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


【解决方案1】:

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

如果您不关心重复中的哪对 {user_state, test_state} 将其放入插入中,您可以通过添加一个简单的 group by 来完全绕过该问题,如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多