【问题标题】:SQL Server - simple discard of duplicate keys/ rows when insertingSQL Server - 插入时简单丢弃重复的键/行
【发布时间】:2015-11-13 06:28:44
【问题描述】:

我正在将数据输入 SQL Server 数据库,由于我无法控制的事情,每 1000 条记录中有 1 条是重复的。它是完全重复的 - 整个记录、唯一标识符 - 一切。

我知道这可以通过“更新”而不是插入步骤来解决……或者“错误时,更新”而不是插入,也许。

但是有没有一种快速简便的方法可以让 SQL Server 忽略这些重复项?我还没有创建索引/唯一约束——但如果我这样做了,我不希望“重复”键值破坏或中断 ETL/数据流过程。我只是让 SQL Server 继续执行插入查询。有没有办法做到这一点?

【问题讨论】:

  • @FirebladeDan 除了mysql sql-server.
  • 是的,我会将语法更改为 sql server 中的详细等效项 --- 我知道“概念”是一种可能性——我只是认为它有很多开销。
  • 谢谢 .. 看起来 IGNORE_DUP_KEY 是查询时间方面最快的方法(也许)。如果将来出现任何严重的数据错误,可能会很危险,但很诱人。

标签: sql-server insert key duplicate-removal


【解决方案1】:

只需在您正在执行的语句中添加一个 WHERE NOT EXISTS -

INSERT INTO table VALUES('123', 'blah') WHERE NOT EXISTS(select top 1 from table where unique_identifier_column = '123')

【讨论】:

  • 这可能是一种可能性。我真的在寻找开销最小的东西。 IE;插入大约 150 万条记录,并且可能每天添加 50,000 条 --- 但我会尝试一下。
【解决方案2】:

为了让其他遇到此问题的人清楚,为了获得最佳性能和丢失插入的轻微机会,应该在表中定义主键并使用 IGNORE_DUP_KEY = ON。

【讨论】:

    【解决方案3】:

    如果您要在每个字段上查找重复记录,只需在您的选择中使用 distinct 子句:

    Insert into DestinationTable
    Select Distinct *
    From SourceTable
    

    编辑: 我误解了你的问题。您正在尝试寻找一种影响较小的方法来防止添加已存在于您的 DestinationTable 中的记录。

    如果您希望插入保持快速,一种方法是在表中添加一个标识列作为主键。让您的重复记录被添加,然后在停机或缓慢时间运行维护例程,检查自上次检查以来添加的所有记录并删除任何添加的重复项。否则,没有简单的方法...您必须检查每个插入。

    【讨论】:

      猜你喜欢
      • 2015-12-27
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多