我正在运行一个中型系统(PHP + MySQL),我有一个表存储所有用户的朋友(这些信息来自Facebook)。该表现在有大约100万行。
每次用户登录时,系统都会从此表中删除所有用户的朋友,然后使用从Facebook下载的数据再次插入,所以编码如下:
1) Run Facebook Query and store results in an object.
2) If query wasn`t successful, end program.
3) DELETE FROM UserFriends WHERE idUser = $idUser
4) INSERT INTO UserFriends (idUser, FriendFacebookId) VALUES
($idUser, $objFB[x]),
($idUser, $objFB[x2]),
($idUser, $objFB[x3])
...
*它在循环内生成查询,因此它只在一个查询中插入所有行)
运行INSERT语句的有时(2000年~1)会返回以下错误:
1062 : Duplicate Entry for '2030-0202001910' for key 'PRIMARY'
'2030-0202001910'
是用户ID和FriendFacebookID ......它始终是INSERT语句中的第一组数据。
所以问题是:我刚刚删除了该用户的所有内容,该用户应该为该表空,但是当我尝试为该用户插入数据时,它会返回此消息。为什么会发生这种情况,我该如何避免呢?
请注意:这个程序每小时运行数百次,错误只发生几次......如果同一个用户尝试再次登录,程序就像预期的那样...所以我想这可以是DELETE命令和数据之间的一些“延迟”已从表中删除......我不知道。
有用信息:表是InnoDB,我没有使用交易。
答案 0 :(得分:0)
尝试此而不是插入:INSERT IGNORE
这意味着“忽略重复”'所以它永远不会产生造成碰撞的可能性。
看看它是否适合你。
你也可以使用INSERT ... ON DUPLICATE KEY UPDATE
...或简单地说:REPLACE
而不是普通的INSERT命令