2010-01-12 34 views
3

用戶可以在文本字段中輸入關鍵字並使用逗號分隔這些關鍵字。
所以輸入可能是bananas, apple, orange, pineapple如何處理單個列數據庫中的重複條目?

在我的數據庫中,我有一個名爲keyword的表,它只有一列keyword,它也是主鍵。

我的關鍵字添加到數據庫中,通過$myArray = expload(',', $keywords)
然後我遍歷數組並執行一個`INSERT INTO myTable'。

現在,如果關鍵字已經存在,我會收到一條錯誤消息。

我可以用INSERT IGNORE INTO聲明克服錯誤消息。如果記錄是重複的,那麼IGNORE關鍵字告訴MySQL放棄它而不會產生錯誤。

我的問題是:這是做這件事的好方法嗎?或者我應該先檢查一下,看看這個關鍵字是否存在?
我有點思考兩個查詢與一個。這會影響服務器負載嗎?

回答

4

插入忽略是偉大的,它殺死了一石二鳥。

插入忽略在理論上是不標準的SQL,但它仍然是非常有用的。如果您需要與其他存儲引擎一起使用,那麼如果這樣的事件發生,您可以改進這些小事情......在這種情況下,無需經過預先移植代碼即可。

+1

+1使用「改善」 – mozillalives 2010-01-12 19:01:48

+0

大。感謝您確認我的懷疑。不得不穀歌「改善」 - 不習慣表達程序員; o)。 – Steven 2010-01-12 19:06:13

0

INSERT IGNORE非常好。我知道的唯一其他語法是REPLACE INTO,但它是用於另一個用例(它刪除並插入行,如果它已經存在,這可能會更慢)。

使用兩個查詢是一個壞主意,因爲SELECT查詢可能需要很長的時間才能找到你正在尋找的行。

1

雖然我不鼓勵使用INSERT IGNORE出在這種情況下,主要的原因,我認爲這裏有一些實際的考慮。

我認爲這將是更快,如果你想在發送之前進行重複數據刪除陣列。我看起來像你正在使用PHP - 你可以使用array_unique()進行重複數據刪除。 (見http://nl2.php.net/manual/en/function.array-unique.php

這樣做的好處是:

  1. 無需INSERT IGNORE - 您的解決方案也適用於其他數據庫以及
  2. 以下語句生成,少報表發送,少報表工作MySQL解析 - 更快。
  3. 對於典型的網絡應用程序,數據庫動作比PHP處理慢,所以它也不會傷害。

我會建議的另一件事是產生一個大的INSERT語句,像這樣:

$sql = INSERT INTO tab (keyword) VALUES ('word1'), ('word2'), ... 

相反的是,很多人認爲這是標準的SQL。這樣做的好處是,你有一個往返, - 的方式減少開銷

+0

輸入字符串中的重複項不是問題。問題是如何處理數據庫中的重複條目。 – Steven 2010-01-12 19:11:12

+0

但是,多謝'array_unique()'並使用一個INSERT語句。 – Steven 2010-01-12 19:37:30

0

只是採取了盲拍這個......你可能想看看其他的對策:

當DBMS系統提供了類似的選項在你提到的「忽略」中,他們很可能已經優化了它的性能,而不是你提到的「檢查和插入」選項,因爲這是唯一的替代方法,「忽略」將不得不競爭,如果不是任何比「檢查和插入」更好的選擇,它沒有任何意義去「忽略」。根據我的經驗,當有dbms提供的功能時,使用它與使用手動方法相比幾乎總是更好。至少,它最大限度地減少了事務的延遲,而且通常會在內部進行大量優化性能......但同樣,事情不能一概而論,必須根據具體情況進行檢查......這只是作爲指導