2015-09-29 30 views
1

我最近在客户端API中发现错误。它根据时间戳发送唯一记录页面。每隔一段时间,它会在上一页末尾发送相同的确切记录,并在下一页开始。MS SQL Server - 如何在表插入期间忽略/丢弃非常罕见的重复行

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

我的问题是---什么是最好的方式来摆脱这些重复,然后让MS SQL在插入时安静地丢弃这些重复的记录?在原件写入交易后,它们肯定会插入。这些重复每10,000行发生一次 - 所以记忆光线会很棒。

记录的唯一不同部分是“ETL批次ID” - 其他所有内容都是相同的。否则,每个记录都应该有一个唯一的“事件ID”。如果我使这个事件id是一个唯一的索引/键,我能以某种方式强制MS SQL转储任何重复的键吗?或者应用程序会抛出错误消息并在查询过程中停止?

回答

0

有臭名昭着的IGNORE_DUP_KEY索引选项可以回答你的问题。如果试图避免使用它,因为它会以这种非常微妙而难以发现的方式改变插入语义。

虽然这是非常有效的:http://blogs.msdn.com/b/craigfr/archive/2008/01/30/maintaining-unique-indexes-with-ignore-dup-key.aspxhttp://sqlblog.com/blogs/paul_white/archive/2013/02/01/a-creative-use-of-ignore-dup-key.aspx

如果我让这个事件id是一个唯一的索引/键,我可以以某种方式强制MS SQL转储任何重复的键吗?或者应用程序会抛出错误消息并在查询过程中停止?

是的,插入将失败。这是大多数情况下的首选方式。如果你不能做这件事IGNORE_DUP_KEY可能是下一个最好的事情。

+0

很好,如果忽略ignore_dup_key,我的选择是什么?防止重复密钥到达数据库?我认为,无论使用哪种编程语言,甚至是针对数据库的更新查询,都会大大减缓流程的速度。 – user45867

+0

如果跟踪上一页的最后一条记录并将其与当前页的第一条记录进行比较,该怎么办?如果您确信该模式总是“页面的最后一个记录有时被下一页的第一条记录重复”。 –

+0

您也可以考虑要求客户端API的所有者修复它们的错误:)他们可能不知道它存在,或者他们可能有解决方案/解决方法。 –