2014-07-24 12 views
4

我想問一個關於MySQL中唯一列的問題。 想問專家是哪一種更好的方法來解決這個問題,如果有什麼優點或缺點的話。MYSQL中是否存在唯一列的缺點

  • 設置VARCHAR列作爲唯一
  • 做SQL INSERT忽略
  • 如果受影響的行> 0繼續進行運行的代碼

  • 發表VARCHAR列爲非唯一
  • 執行搜索查詢以查找相同的值
  • 如果沒有行的查詢返回,做一個SQL INSERT
  • 着手運行的代碼
+0

你不打算在第二種情況下插入任何東西? – Thilo

+0

我不知道mysql的「幕後」。但我認爲IGNORE關鍵字將貫穿您的表格,然後繼續插入值(如果未找到)。 如果您使用的功能實際上可以返回受影響的行,我認爲IGNORE功能將是您的最佳選擇 – Caweren

+0

如果列中的值必須是唯一的,那麼使用數據庫爲您提供的工具和構建代碼來處理數據庫在您嘗試插入不唯一的值時拋出的異常。 – Stefan

回答

3

定義爲唯一索引有幾個優點一列,首先,當你把它定義爲一個「唯一索引」MySQL可以優化索引的唯一值(與主鍵相同),因爲mysql不必檢查是否有多個具有相同值的行,因此它可以使用優化的查找算法。

另外,您可以放心,在您的數據庫中永遠不會出現重複條目​​,而不是在代碼中的多個位置處理此問題。

當你沒有將它定義爲UNIQUE時,首先需要檢查表中是否存在記錄,然後插入一些需要2個查詢(甚至是全表鎖)而不是1的東西,這會降低你的性能,更容易出錯

http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html

我要離開的事實,你可以使用INSERT忽略至極忽略異常時,該條目在數據庫中存在媒體鏈接(你仍然可以在可能使用它的高性能操作某種特殊情況)。如果一個條目已經存在,正常的INSERT會給你反饋

+0

搜索表格以確保唯一性不適用於併發插入。兩個插入既可以查詢表格,也可以插入確定以插入非唯一條目。 – Jaydee

+0

這就是爲什麼你需要一個完整的表鎖在這個過程 –

+0

對不起,我誤解了你的觀點。 – Jaydee

3

這兩種方法都不好。

你不會做INSERT IGNORE也不會搜索。搜索部分也是不可靠的,因爲它在併發性方面失敗並且損害了完整性。想象一下這種情況:你和我嘗試在數據庫中插入相同的信息。我們同時連接。有問題的代碼確定數據庫中沒有這樣的記錄,對我們來說都是如此。我們都插入相同的數據。現在你的專欄不是唯一的,因此我們最終會得到2條相同的記錄 - 你的完整性現在失敗了。

你所做的是將列設置爲unique,插入並用你選擇的語言來捕獲異常。 如果發生重複記錄,MySQL將會失敗,並且MySQL的任何適當的db驅動程序都會將此視爲異常。 由於您尚未提及該語言,因此很難繼續使用示例。