2011-11-06 138 views
2

我正在構建一個經常更新其他API的本地數據庫的系統。我將Python腳本設置爲cron作業,並且他們幾乎可以完成這項工作。防止基於列(MySQL)的重複行?

但是,一個缺點是,腳本需要很長時間才能執行。當他們第一次運行時,這個過程很快,但在此之後,需要將近20分鐘才能從第三方API接收到的200k +項目清單。

問題是腳本首先從數據庫中獲取所有行,並將其必須唯一的列值添加到列表中。然後,在瀏覽API結果時,它會檢查列表中是否存在當前項目必須唯一的值。這真的是真的沉重,因爲列表中有超過200K的值。

有沒有辦法檢查INSERT - 查詢,基於單列,沒有重複?如果存在,則不要添加新行。

任何幫助將不勝感激=)

回答

5

如果添加UNIQUE鍵,它必須包含唯一值的列(S),MySQL將當你插入一行違反此約束抱怨。

然後,您有三種選擇:

  • INSERT IGNORE將嘗試插入,以及違反的情況下,什麼也不做。
  • INSERT ... ON DUPLICATE KEY UPDATE將嘗試插入,以及違反的情況下,更新該行的新值
  • REPLACE將嘗試插入,以及違反的情況下,刪除有問題的現有行,並插入新的。
+0

雖然是一個問題。有些場合要求共同獨特的列是重複的,而另一列不能。有沒有辦法讓唯一列設置查詢特定? –

+0

您的商業規則越複雜,現成的解決方案的可能性就越小。也許還有其他方法可以對它們進行建模,以使它們得到內置機制的支持。示例:如果您有一個帶有唯一鍵的UNIQUE鍵的表以及另一個沒有其他鍵的UNIQUE鍵的克隆表,則可以使用UNION表創建的視圖可以滿足您的需要。這取決於您的業務規則,但... – Konerak

+0

好吧,我明白了。謝謝你的幫助。 –