2010-12-10 95 views
0

我有一個非常簡單的情況,我有點困惑。我想插入一條記錄,該記錄必須是唯一的。因此,如果存在,我需要替換它或刪除並重新插入它。如果它不存在,我需要創建它 - 但需要擔心其他人在同一時間執行檢查並創建同一個檢查。鎖定插入

任何人都可以推薦「正確」的方式來做到這一點在鎖定MySQL?即阻止某人同時做同樣的事情?

如果我這樣做 - 我不保護,以防止與相同條件的記錄併發插入:

BEGIN TRANSACTION 
SELECT (condtions) FOR UPDATE 
if rows exist 
    UPDATE 
else 
    INSERT 
COMMIT 

似乎是一個簡單的事情 - 很明顯在SQL生疏......

還:

如果我持有一個鎖,並且另一個用戶試圖讀取/寫入鎖持有的某些內容 - 其他用戶是否會收到錯誤,或者他們的處理是否會延遲,直到鎖被釋放SED?

回答

1

我相信你正在尋找REPLACE(如果存在,刪除,然後重新插入) - http://dev.mysql.com/doc/refman/5.1/en/replace.html

OR

insert ... on duplicate key update ... /* does not remove, just update */ 
+0

超!還有一個相關的問題:我的數據庫中的數據是一張地圖 - 因此每個「唯一」記錄(如果存在的話)都有一個X和Y座標。我可以創建一個使用*兩個*字段的表,這些字段必須是唯一的 - 還是需要將這些數字合併到一個值中並將其作爲唯一鍵? – Brad 2010-12-10 20:51:29

+0

當然,這被稱爲自然鑰匙 - http://en.wikipedia.org/wiki/Natural_key作爲替代鑰匙的對面 - http://en.wikipedia.org/wiki/Surrogate_key。優點和缺點可以在SO上找到,也可以在wiki上討論 – ajreal 2010-12-10 21:09:41