2011-07-21 39 views
7

我有一個代碼有兩個mysql查詢。
DELETE FROM my_table WHERE user_id=some_number
INSERT INTO my_table (user_id, ...) VALUES(some_number, ...)由於「重複項」刪除失敗後mysql插入

領域user_id是唯一的。

在極少數情況下插入失敗,聲稱發生了重複條目。我的第一本能讓我相信DELETE沒有完成,現在插入試圖插入,我得到一個重複的條目。這可能嗎?我怎樣才能避免這種情況?可以想象一個不同的解釋嗎?

更新:我刪除的原因是因爲我想刪除所有不是我第一次更新/插入的數據。另外,我認爲重要的是說大部分數據保持不變。

+0

是否有可能是兩個進程同時爲同一個ID運行這兩個語句的競態條件? –

+0

你可能有興趣在REPLACE和INSERT ... ON DUPLICATE KEY UPDATE語句 –

+1

DELETE失敗可能嗎?執行後是否有一些檢查? – ascanio

回答

1

您可以隨時在DELETE後嘗試COMMIT以確保其完成。

+0

我只需要添加另一個查詢「COMMIT」來嘗試?如果其他查詢速度緩慢,它是否也會等待它們,或者我可以等待刪除完成嗎? – Noam

+0

是的,你可以自己做提交。從你所發佈的代碼中不應該真的需要,但它會迫使完成第一個語句的問題。 –

2

使用UPDATE語句來代替:

UPDATE my_table 
SET my_column = my_value 
WHERE user_id = some_number 
+0

你可以(這是'INSERT INTO'語法中的一個MySQL變種)。看這裏; http://dev.mysql.com/doc/refman/5.1/en/insert.html –

+0

@ypercube你是對的。 –

+0

更新不會刪除我希望替換的舊數據。對? – Noam

2
SET AUTOCOMMIT=0;  
START TRANSACTION;  
DELETE FROM my_table WHERE user_id=some_number;  
INSERT INTO my_table (user_id, ...) VALUES(some_number, ...); 
commit; 
1

你爲什麼DELETE然後INSERT相同user_id並不僅僅是UPDATE行?

+0

因爲我想刪除所有我第一次不更新/插入的數據,而我不更新具有相同數據的所有行。每個新行/更新的行都會有不同的數據。 – Noam

-2

發生這種情況是因爲查詢被視爲兩個單獨的事務,所以不能保證執行的順序。您所描述的效果是因爲插入在刪除之前進行處理。您應該更改查詢邏輯或在一個事務中執行兩個查詢。