2015-09-29 65 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的所有者修復它們的錯誤:)他們可能不知道它存在,或者他們可能有解決方案/解決方法。 –