2015-04-23 62 views
0

我想我想要UNIQUEIGNORE_DUP_KEY的語義。忽略唯一約束並仍插入其他行

我有一個INSERT查詢查看最近的數據並插入一個唯一的鍵值對。它經常運行,最多隻需要幾秒鐘。

我有另一個INSERT查詢查看所有數據並插入唯一的鍵值對。運行需要幾分鐘的時間,並且可能找不到任何事情,除了它有時會看到與最近查詢相同的數據,並且會決定插入同一對。

我已經實現了一個UNIQUE約束,所以這本身並不是問題,但是我希望插入長時間運行的查詢所確定的其他記錄,而不管重複。

兩個查詢不明確也有類似的條款,以

WHERE NOT EXISTS (SELECT Key, Value From TargetTable TT 
    WHERE TT.Key = Result.Key AND TT.Value = Result.Value) 
+0

如果我理解正確的話,可能是你正在尋找 – ughai

+0

你能打破成兩種不同工藝填充,然後兩個獨立的表這對'鍵,Value'獨特的過濾指數僅最近過濾後的數據一個視圖,即使該行存在於兩個表中,也會出現只存在一行的錯覺(喜歡快速過程中的行)? –

回答

0

我決定第二查詢拆分成兩個,讓我現在有三個疑問:

  • 快速15分鐘跑過去每30秒查詢。
  • 快速查詢回顧午夜UTC;可能有重複的關鍵失敗,但重試不會很長;每2分鐘運行一次。
  • 緩慢查詢查看所有數據,但忽略當前UTC日期;將不會有重複的關鍵失敗;每天運行兩次。
1

如果我理解正確的話,你想要的東西,如MySQL的INSERT IGNORE。我不相信這個功能存在於SQL Server中。您的特定問題似乎是更新過程中發生的更新(或其他表),引入重複密鑰。

一個選項是在此操作過程中對錶進行鎖定,不允許任何其他操作。考慮到鎖的時間限制,這可能是不可行的。

另一種選擇是採取長時間運行的查詢並將結果存儲到臨時表中。然後,從這張表中逐個插入,捕獲並忽略任何違反唯一約束的情況。