【问题标题】:MS SQL Server - how to ignore/ discard very rare duplicate rows during table insertMS SQL Server - 如何在表插入期间忽略/丢弃非常罕见的重复行
【发布时间】:2015-12-27 13:17:51
【问题描述】:

我最近在客户端 API 中发现了一个错误。它根据时间戳发送独特记录的页面。每隔一段时间,它会在上一页的末尾和下一页的开头发送相同的确切记录。

我在假设没有重复的情况下进行操作(这毕竟是一个事件日志)。因此我做的是纯插入,而不是经历更新或某种“重复”步骤的麻烦。

我的问题是 --- 摆脱这些重复记录的最佳方法是什么,然后让 MS SQL 在插入时悄悄丢弃这些重复记录?它们肯定是在原始文件写入事务之后插入的。这些重复每 10,000 行发生一次 - 所以非常容易记忆的东西会很棒。

记录中唯一不同的部分是“ETL 批次 ID”——其他一切都相同。否则,每条记录都应该有一个唯一的“事件 ID”。如果我将此事件 id 设置为唯一索引/键,我可以强制 MS SQL 转储任何重复键吗?或者应用程序会在查询期间抛出错误消息并停止?

【问题讨论】:

    标签: sql-server insert duplicate-removal ignore-duplicates


    【解决方案1】:

    臭名昭著的IGNORE_DUP_KEY 索引选项可以回答您的问题。 If 会尽量避免使用它,因为它会以这种非常微妙且难以发现的方式更改插入语义。

    不过,它非常高效:http://blogs.msdn.com/b/craigfr/archive/2008/01/30/maintaining-unique-indexes-with-ignore-dup-key.aspxhttp://web.archive.org/web/20180404165346/http://sqlblog.com:80/blogs/paul_white/archive/2013/02/01/a-creative-use-of-ignore-dup-key.aspx

    如果我将此事件 ID 设为唯一索引/键,我可以强制 MS SQL 转储任何重复键吗?或者应用程序会在查询期间抛出错误消息并停止?

    是的,插入会失败。这是大多数情况下的首选方式。如果您无法完成这项工作,IGNORE_DUP_KEY 可能是下一个最好的选择。

    【讨论】:

    • 如果建议不要使用ignore_dup_key,那我的选择是什么?防止重复键到达数据库?我认为一个过程,无论是什么编程语言,甚至是对数据库的更新查找,都会大大减慢这个过程
    • 如果您跟踪上一页的最后一条记录并将其与当前页面的第一条记录进行比较怎么办?如果您确信该模式始终是“页面的最后一条记录有时会与下一页的第一条记录重复”。
    • 您也可以考虑让客户端 API 的所有者修复他们的错误 :) 他们可能不知道它的存在,或者他们可能有解决方案/解决方法。
    猜你喜欢
    • 2015-11-13
    • 2018-12-15
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多