【发布时间】:2011-09-24 21:29:52
【问题描述】:
我有一个 php 脚本来检查表中的特定唯一条目。如果该条目不存在,它会为该数据创建一个新行,否则它只会更新该条目的计数。我的脚本可以同时(在同一秒)被击中。在这种情况下,脚本的两个实例一起检查并且找不到条目并尝试插入记录。在这种情况下,第二个实例会引发错误。
有什么办法可以防止。
使用this question中提到的方法会有帮助吗?
【问题讨论】:
我有一个 php 脚本来检查表中的特定唯一条目。如果该条目不存在,它会为该数据创建一个新行,否则它只会更新该条目的计数。我的脚本可以同时(在同一秒)被击中。在这种情况下,脚本的两个实例一起检查并且找不到条目并尝试插入记录。在这种情况下,第二个实例会引发错误。
有什么办法可以防止。
使用this question中提到的方法会有帮助吗?
【问题讨论】:
你必须
LOCK TABLES ...)UNLOCK TABLES)【讨论】:
MySQL 支持“REPLACE”操作,它将删除现有行并重新创建它(可能不完全是您要查找的内容):http://dev.mysql.com/doc/refman/5.0/en/replace.html
您真正在寻找的是“INSERT ... ON DUPLICATE KEY UPDATE”:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
他们在该页面上的第一个示例似乎就是您所描述的:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
当 INSERT 导致主键或唯一键发生冲突时,它会起作用,然后作为 UPDATE 运行。
【讨论】:
为什么不直接插入并期待 1022 重复键错误?
【讨论】: