SQL Server:将行复制到另一个没有重复键的表

时间:2015-10-27 05:26:23

标签: sql sql-server

我有一个SQL问题让我忙了好几天了。我想要的是将大多数行从一个表(ORIGIN)复制到另一个表(DESTINATION),但是,在DESTINATION中不应该有具有相同PRIMARY KEY的行。在ORIGIN中,我们可能会在给定时刻有许多重复项。好吧,到目前为止一切顺利,我们有很多方法,他们总是在MySQL工作(这是我一直合作的)。但现在我被迫使用SQL Server 2008。

到目前为止,我已尝试过NOT EXIST,NOT IN和JOIN方法。我做的并不重要,我总是得到臭名昭着的重复键错误。例如,如果我使用它:

insert into DESTINATION 
   select * 
   from ORIGIN 
   where ORIGIN.[MY-PRIMARY-KEY-FIELD] not in
        (select [MY-PRIMARY-KEY-FIELD] from DESTINATION)

然后我明白了:

  

违反PRIMARY KEY约束' PK__DESTINAT__52F5604C11CBEE86'。无法在对象' dbo.DESTINATION'中插入重复键。重复键值为(00013884880195)。

当然,指定的值在ORIGIN中重复,但这就是为什么我在插入之前检查它是否也存在于DESTINATION中。我得到了与其他方法相同的确切错误消息。什么都行不通。

我唯一能想到的是,也许,这是线程或做奇怪的东西,以便在我们检查它时行仍然不存在。有没有办法强制某种"同步模式"以便在我们检查信息时尽快将信息推送到表中以确保数据存在?这是丢弃那个......的简单方法。

或许我在这里绕过愚蠢的事情。我不知道。因此,欢迎任何关于这里可能发生的事情的暗示。

事先谢谢。

3 个答案:

答案 0 :(得分:0)

您可以在查询中使用NOT EXISTS来查找与

不匹配的记录
INSERT INTO DESTINATION  (colfk,col1, col2, col3)
SELECT * FROM (SELECT coppiesfk,coppiesRow1, coppiesRow2, coppiesRow3) AS tmp
WHERE NOT EXISTS (
    SELECT colfk FROM DESTINATION  WHERE colfk = coppiesfk
) LIMIT 1;

答案 1 :(得分:0)

可能这个更好的选择..

insert into DESTINATION 
Select * from (
select <column_list>,
row_number() over (partition by PK order by PK ) as rnm
from origin)Temp
where rnm=1;

答案 2 :(得分:0)

您正在检查DESTINATION ID是否已ORIGIN ORIGIN,但如果ID有两行DESTINATION相同DISTINCTinsert into DESTINATION select DISTINCT * from ORIGIN where ORIGIN.[MY-PRIMARY-KEY-FIELD] not in (select [MY-PRIMARY-KEY-FIELD] from DESTINATION) 中不存在,则会插入两行=&gt;重复密钥。

一种可能的变体 - 添加string

split