将数据插入没有唯一列的SQL Server表时避免重复

时间:2019-06-18 20:51:53

标签: sql sql-server insert duplicates

我正在定期存档某个表,并希望避免在该存档中重复。表中没有唯一列,因此我目前正在使用以下方法:

INSERT INTO archive (colA, colB, colC)
    SELECT
        colA, colB, colC
    FROM 
        dim.source src
    WHERE
        CONCAT(src.colA, src.colB, src.colC) NOT IN (SELECT CONCAT(colA, colB, colC) FROM archive)

这行得通,但是考虑到存档包含> 4000万行,它相当慢(超过10分钟)。还有更有效的选择吗?

谢谢!

我在stackoverflow上尝试了其他几种解决方案,但是它们对我不起作用,并导致错误消息

2 个答案:

答案 0 :(得分:0)

在MySQL中,我建议使用on duplicate key update

create unique index unq_test_all on test(colA, colB, colC);

然后:

insert into test (colA, colB, colC)
    select colA, colB, colC
    from dim.source s
    on duplicate key update colA = values(colA);

答案 1 :(得分:0)

MySQL允许元组比较,因此您不需要CONCAT:

WHERE (src.colA, src.colB, src.colC) NOT IN (SELECT colA, colB, colC FROM archive)

使用这种函数消除了利用任何索引的可能性;但我不确定元组比较的效率如何,所以可能会更好:

LEFT JOIN archive AS a ON src.A = a.colA AND src.B = a.colB AND src.C = a.colC
WHERE a.archive_id IS NULL -- archive_id can be replaced with any field from archive you know would not be null if there were a match.

,当这些方法都无法正常工作时,您可以随时尝试使用相关子查询:

WHERE NOT EXISTS (SELECT * FROM archive WHERE colA = src.A AND colB = src.B AND colC = src.C)