我有这个代码,它解析JSON并且每隔 5 MINS 通过php file.php
命令运行。
foreach($data->chatters->staff as $viewers)
{
$sql = "INSERT INTO viewers (user,points)
VALUES('$viewers','10')
ON DUPLICATE KEY UPDATE
points = points+5";
if ($conn->query($sql) === TRUE) {
//echo "Staff: Done";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
}
出于某种原因,每个周期都会增加ID计数。 现在我的数据库看起来像这样:
id user points
1 uname1 123
2 uname2 123
18 uname3 123
256 uname4 123
ID值不断增加。我错过了什么?
感谢。
答案 0 :(得分:1)
在解释之前:您遇到的是正常。
为每个id
查询生成INSERT
个数字。这是一个原子操作,加上该功能被设计为在并发环境中工作(许多人用一大堆请求命中一个数据库)。
为了能够同时服务,MySQL将事务彼此隔离,并且每个事务都将其视为自己的“泡沫”。这意味着,每次插入发生并生成auto_increment时,不能为不同的查询生成相同的值。
实现这一目标的唯一方法是让MySQL始终增加数量并且永远不会重复使用它。这是唯一可行的解决方案,也是最快的解决方案。
这是什么意思 - 这意味着每次在查询中遇到唯一约束时,为auto_increment
生成的值都将“浪费”,插入不会发生,而是{{1部分被执行。
你无法解决它,你可以打破它。保持原样,你做得对。
UPDATE
的工作只是提供唯一的数字。如果他们以某种方式花费了(通过插入失败)那么这很好,而不是你需要担心的事情。
答案 1 :(得分:0)
ON DUPLICATE KEY UPDATE
都会创建一个新行。
如果您不希望它如此,则必须提出两个查询:一个用于INSERT
查询,另一个用于UPDATE
查询。