2012-04-14 105 views
1

我有一個系統,涉及到一個表中插入一行的ajax發佈請求。似乎有時ajax調用會被調用兩次,這意味着相同的數據會在兩個相鄰的行中插入兩次。MYSQL避免插入同一行兩次

我打算首先添加一個查詢來嘗試並選擇具有相同數據的行,然後如果行數= 0添加它。有沒有更好的方法避免必須做兩個查詢?

+0

這已先前所討論的,參見http://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql – cfedermann 2012-04-14 14:37:40

+0

考慮另一種方法,解決問題的根源在導致AJAX調用的頁面上發生兩次,而不是編寫防禦性SQL查詢。網頁上的「IsDirty」標誌也許? – 2012-04-14 14:37:59

+2

您的表沒有主鍵或其他唯一約束,以確保您的數據庫中沒有重複的數據?你應該。而ID列是不夠的;它很方便並且自動生成,但是您應該有其他一些獨特的屬性組合。然後嘗試插入重複數據失敗。必須有一種方法可以告訴你插入'同一行'兩次;否則,你不可能問這個問題。 – 2012-04-14 15:00:14

回答

3

您可以在插入語句中使用INSERT IGNORE INTO語法或INSERT ... ON DUPLICATE KEY UPDATE。

如果使用INSERT IGNORE,那麼如果該行導致重複鍵,則該行實際上不會被插入。但該聲明不會產生錯誤。它會生成警告。

INSERT IGNORE INTO mytable 
    (primaryKey, field1, field2) 
VALUES 
    ('abc', 1, 2); 
0

我想說的是,處理這個問題的最好方法是在應用程序中使用一個臨時令牌(它可以作爲一個CSRF令牌來使用,無論如何你可能需要這個令牌)。

如果令牌與操作一起發送,則令牌過期,因此不能重複該令牌。