2009-02-10 21 views
8

IGNORE_DUP_KEY = ON基本上告訴SQL Server插入非重複的行,但默默地忽略任何重複;默認行爲是在列中存在不允許的列時出現重複錯誤並中止整個事務。你爲什麼不把IGNORE_DUP_KEY設置爲ON?

我已經處理了大量通常至少有一個重複的數據,所以當我知道一個值不應該有dups時,我喜歡使用UNIQUE約束;然而,當我嘗試批量加載數據時,我想要的最後一件事是它完成了90%,然後突然遇到了一個複製,並且出錯了整個事情(是的,我知道明顯的解決方案是確保沒有重複,但有時我只是遞給一個填充數據的電子表格,並告訴儘快加載它)。

那麼,什麼是具有默認是OFF,爲什麼不會你希望它是在所有的時間,使任何非DUP項成功,而你不用擔心的原因任何重複;無論如何,重複的機會都是錯誤的。

它是關係到性能,還是別的?這似乎是一個好主意,但是爲什麼它不是默認行爲呢?

主要是,有沒有很好的理由不是使用這個,我應該知道,或者它應該在逐案評估?

回答

15

每當與數據庫中的「正常」有偏差時,您可能想知道它。

您保持密鑰的獨特性是因爲一些約束產生的商業需求。數據庫只是保持協議的一面,說'你希望這是獨一無二的,但現在你說的是相反的事情。讓你的心」

如果是故意的,你可以問數據庫使用IGNORE_DUP_KEY閉嘴:)

+1

一個評論,設置忽略ON不是沒有後果。如果您有一個標識列,您會看到因重複而被忽略的每個插入標識的標識跳過。 – 2014-01-26 22:01:56

+1

在非聚集索引上使用此選項會降低性能[使用IGNORE_DUP_KEY維護唯一索引](https://blogs.msdn.microsoft.com/craigfr/2008/01/30/maintaining-unique-indexes-with -ignore_dup_key /),並且可能導致嚴重的範圍鎖定,併發插入批處理[範圍鎖定(RS-U),由於IGNORE_DUP_KEY索引選項](http://aboutsqlserver.com/tag/locking/)。因此,當您想要在一個鏡頭中插入多行並忽略重複項時,只能將其應用於羣集鍵。 – eremmel 2016-11-04 16:22:35

1

它可以用作健康檢查。如果你知道不應該有衝突,那麼它就會在錯誤上快速失敗。 OTOH用於臨時控制檯會話,我明白了你的觀點。

+0

正確 - 我想說明一下「重複錄入」的情況是否是例外情況,以及是否應該提出錯誤或忽略它。 – 2009-02-10 19:11:08

2

我想這可能是因爲默認設置,以防止任何無效的交易失敗的默默。所有考慮的事情,我寧願選擇何時忽略意想不到的後果,但請告訴我,除非我另有說明。

例如:如果我要存入薪水,我希望有人注意到我的僱主是否意外地發出了重複的支票號碼。

+0

這也是如此。我想最好的理由是,它會在謹慎的方面犯錯,並會產生錯誤,除非您另有說明。 – 2009-02-10 19:14:40

2

機會是重複的都在裏面誤反正。

我敢打賭他們是!他們是錯誤。你當然想知道他們!通過損壞數據圖靈在IGNORE_DUP_KEY默認是...

  1. 隱藏的錯誤...
  2. ...。 (當然,數據庫保持物理上的一致性,但從業務邏輯的角度來看,數據仍然是錯誤的。)

這是任何標準的可怕選擇。

在特殊情況下打開它,然後儘快將其清除,以免意外隱藏錯誤。

1

我有一個多對多的關係。我有一個具有唯一索引的產品到類別表,沒有其他數據比表中的prodid和katid。

所以我在獨特的(prodid,katid)索引上設置IGNORE_DUP_KEY。

所以我可以放心地說「添加產品(1,2,3)到類別(a,b,c)」,而不必檢查某些產品是否已經在某些類別中;我只關心最終結果。

相關問題