2010-12-10 75 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