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语句。这样,我也可以在插入后进行更新。总是检查简单的东西