【问题标题】:Avoid duplicates when inserting data into a SQL Server table without unique column将数据插入没有唯一列的 SQL Server 表时避免重复
【发布时间】:2019-11-01 13:21:05
【问题描述】:

我正在定期归档某个表,并希望避免在该归档中出现重复项。我的表中没有唯一的列,所以我目前正在使用以下方法:

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)

这行得通,但鉴于存档包含 >40M 行,它非常慢(10 分钟以上)。有没有更有效的选择?

谢谢!

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

【问题讨论】:

  • 我很困惑。 MySQL 不支持以# 开头的表名。
  • 我不是在 MySQL 中工作,而是在 SQL 中工作。不过,stackoverflow 搜索显示了两者的结果

标签: sql sql-server insert duplicates


【解决方案1】:

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)

【讨论】:

    【解决方案2】:

    在 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);
    

    【讨论】:

    • 我在SQL环境中工作,应该已经澄清了,对不起
    • @Berbatov MySQL 是 SQL,Postgres 和 Oracle 等也是。你是说 MS SQL Server 吗?
    • 我愿意(MS SQL Server)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多