我運行值選擇我的臨時表,並將其插入到數據庫中,像這樣一個存儲過程:INSERT INTO ..選擇..違反唯一約束
INSERT INTO emails (EmailAddress) (
SELECT
DISTINCT eit.EmailAddress
FROM #EmailInfoTemp eit
LEFT JOIN emails ea
ON eit.EmailAddress = ea.EmailAddress
WHERE ea.EmailAddressID IS NULL )
在罕見的情況下(〜每對夫婦一次在處理數千個請求的服務器上花費數小時),然後我在EmailAddress列的索引上收到唯一約束錯誤「違反UNIQUE KEY約束」。
我可以確認我沒有傳入重複值。即使我是,它應該被DISTINCT抓住。
- SQL Server 2008的 -Stored PROC +不使用事務+ JDBC的CallableStatement
是可能發生的SELECT和隨後的INSERT之間,不存在對相同/不同的存儲過程已完成的INSERT另一個電話與類似的數據?如果是這樣,那麼防止這種情況的最好方法是什麼?
一些想法:我們有許多重複的「客戶端」實例在生產環境中同時與這個SQL Server進行通信,所以我的第一反應是併發問題,但我似乎無法自己複製它。這是我的最佳猜測,但到目前爲止它已經走到了盡頭。這種情況在我們的暫存環境中不會發生,與生產環境相比,負載無關緊要。這是我開始關注併發問題的主要原因。
雙方EmailAddress中的NULL值可能違反唯一鍵約束。如果此列可以爲空,則可以將插入重寫爲「not exists」。 – 2013-03-13 15:00:05
好點。我檢查代碼中的空值,但我想我可以在sql中再次檢查它。 – 2013-03-13 15:06:39