2012-02-13 40 views
5

好的,我有一個問題,不是一個真正的問題。「更換進」與插入[IF]

我在我的數據庫中有一張表,相當小,只有3列,但有可能增長。我有兩個解決方案來解決我的問題,但不知道爲什麼要使用其中一個。

我有一塊數據,可能已經或可能不在數據庫中。兩種方法來解決這個問題。我擁有唯一的ID,因此很容易檢查。

  1. 檢查記錄存在於數據庫中,如果沒有,INSERT INTO數據庫
  2. 使用REPLACE INTO,因爲我已經得到了ID了。

我現在的問題是。哪一個更好用。使用2個結果中的哪一個有利有弊。還是有更好的結果?

需要注意的是,數據是完全一樣的,所以記錄沒有機會用更新的值更新。因此REPLACE INTO將插入已經存在的數據。

+10

注意,'REPLACE INTO'在內部實現爲DELETE,然後是INSERT。刪除是一個正常的刪除,這意味着它將檢查外鍵並服從「ON DELETE」子句。你*可能*希望'INSERT INTO ... ON DUPLICATE KEY UPDATE ...'而不管怎樣。 – Charles 2012-02-13 20:13:28

+0

但是,這裏最好的做法是什麼?爲什麼 – 2012-02-13 20:22:58

+2

此外,如果您嘗試更新具有相同(現有)值的行,MySQL將檢測到值相同,並且會跳過更新,從而節省時間,鎖等等 - 使用INSERT的另一個原因INTO ... ON DUPLICATE KEY UPDATE ...「與首先刪除現有行。 – 2012-02-13 20:26:43

回答

10

REPLACE INTO這裏不推薦 - 你並不需要更換任何東西。它確實DELETE其次是INSERT,具有所有後果。例如,所有索引都必須更新,如果經常使用它,會導致不必要的工作和索引碎片化。

另一方面,有ON DUPLICATE KEY UPDATE,它主要用於計數器,但是您不更新行增量或任何其他值更改,因此您將不得不使用奇怪的語法,如SET id=id或類似的東西。

檢查是否存在於數據庫中的記錄將是你最好的解決辦法,但不是使用其他查詢讓MySQL的做檢查,爲您和使用:

`INSERT IGNORE INTO ...` 

這樣,如果你嘗試插入任何具有重複的唯一或主鍵的行都不會被插入而不會產生任何錯誤。請注意可能缺少其他錯誤消息的副作用,但如果您確切知道您插入的內容應該沒問題。