【问题标题】:SQL Server 2000 NOT EXISTS Unique Constraint ViolationSQL Server 2000 不存在唯一约束冲突
【发布时间】:2014-07-25 18:47:21
【问题描述】:

我有一个存储过程,它插入到对临时表中的两列具有唯一约束的目标表中。

INSERT INTO TARGET_TBL
(id,scheme_cd,desig
)
select id,scheme_cd,desig
FROM #TEMP t
WHERE NOT EXISTS(SELECT 1 FROM TARGET_TBL tgt 
WHERE tgt.id = t.id AND tgt.scheme_cd = t.scheme_cd)

临时表可能包含重复记录,并且 TARGET_TBL 在组合 fo id 和 scheme_cd 上具有唯一索引。

我收到错误,因为违反了唯一约束。

谁能帮我解决这个错误。

提前致谢

【问题讨论】:

  • 删除重复记录?
  • 无法删除...。理想情况下,它应该插入第一条记录更新非关键列。

标签: sql-server database bulkinsert


【解决方案1】:

您是否尝试过使用相同逻辑概念的 LEFT OUTER JOIN 版本重新表述?

INSERT INTO TARGET_TBL (id, scheme_cd, desig)
    SELECT t.id, t.scheme_cd, MAX(t.desig)
    FROM #TEMP t
         LEFT OUTER JOIN TARGET_TBL tgt ON tgt.id = t.id AND tgt.scheme_cd = t.scheme_cd
    WHERE tgt.id IS NULL
    GROUP BY t.id, t.scheme_cd 

在这种情况下,由于“设计”不是唯一的,您可以只使用“最大值”。这假设如果您具有相同的“id”和“scheme_cd”,您并不真正关心插入哪个“设计”。如果您确实关心,那么您的问题是您的唯一主键不足,并且还必须包含“设计”。无论插入相同“id”和“scheme_cd”但具有不同“设计”值的进程也可能有问题。但是,如果您不在乎,此更改将解决您遇到的重复密钥问题。

【讨论】:

  • 第二个表有 WHERE IS NULL 子句的 LEFT OUTER JOIN 的 SELECT 应该选择 Temp 中不在 TARGET 中的所有行...并插入这些行。如果您只执行 SELECT 子句(并且有 #TEMP 可访问和填充),您应该只看到 #TEMP 中那些不在 TARGET 中的行。这就是您要插入的内容,是吗?
  • 即使给出两行...因为此时目标表中将没有行...并且会尝试插入失败的目标
  • 我的代码版本和 LEFT OUTER JOIN 版本有区别吗??
  • 您是否尝试在 SELECT 语句中添加“DISTINCT”? SELECT DISTINCT id, scheme_cd, desig... 我已经编辑了答案以包含 DISTINCT。
  • 好的,我想我看到了你的问题......问题是,当你有重复的 id/scheme_cd ......你想为“设计”插入什么?有关系吗?如果没有,您可以添加一个 GROUP BY 并使用最大“设计”。我已经更新了答案以包含它。
【解决方案2】:

在您的 SELECT 语句中尝试DISTINCT

SELECT  DISTINCT id,scheme_cd,desig
FROM    #TEMP t
WHERE   NOT EXISTS(SELECT  1
                   FROM    TARGET_TBL tgt 
                   WHERE   tgt.id = t.id AND tgt.scheme_cd = t.scheme_cd)

【讨论】:

  • 设计可能不同...因此不同也会给出重复记录 100,ABC,MGR|100,ABC,LEAD
  • 那么你也可以在 UNIQUE 中包含desig...否则你不能这样做。或者您可以合并所有设计值并将其存储...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 2015-04-22
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多