Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server主键因截断/删除而冲突?_Sql Server 2008_Primary Key_Truncate - Fatal编程技术网

Sql server 2008 SQL Server主键因截断/删除而冲突?

Sql server 2008 SQL Server主键因截断/删除而冲突?,sql-server-2008,primary-key,truncate,Sql Server 2008,Primary Key,Truncate,我有一组暂存表,在插入到目标表之前,我在其中接受数据、擦洗和清理它们。目标表有一个主键约束,我插入的是主键 在插入之前,我检查目标表中是否缺少主键。根据主键的缺失,我只插入不在目标表中的记录: INSERT INTO Target SELECT primKey , user_state , test_state FROM myStagingTable3 至此,stagingTable3只有使用以下where子句的

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

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

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”。无法插入 对象“目标”中存在重复密钥

我的问题是:

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

很明显,我的暂存表有键,而目标表没有键。但是插入失败。

发生这种情况是因为暂存表包含多个具有相同primKey值的行

如果复制的
{user\u state,test\u state}
对中的哪个
{user\u state}
对进入insert并不重要,您可以通过添加一个简单的
group by
完全绕过该问题,如下所示:

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

我应该补充一点,我读过这篇文章:删除/截断问题很有趣。只是不知道如何解决这个问题。这有点像个傻瓜。谢谢。很可能您的暂存表包含多个值
primKey
。嗯,我刚刚检查过。。。这是真的。。。它确实有多个primKey值。这意味着第二个键值是导致错误的原因,所以整个过程都会被释放,事务被回滚。如果我不能删除重复的语句,我可能会在这里看到一个MERGE语句。这样,我也可以在插入后进行更新。总是检查简单的东西