我有一组暂存表,在插入到目标表之前,我在其中接受数据、擦除和清理它们。目标表有一个主键约束,我插入的是主键。
在插入之前,我会检查目标表中是否缺少主键。根据主键的缺失,我只插入不在目标表中的记录:
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)