我有这段代码,它解析 JSON 并通过 php file.php
命令每 5 分钟运行一次。
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 值不断增加。我错过了什么?
谢谢。
最佳答案
在解释之前:您所经历的情况是正常。
为每个 INSERT
查询生成 id
编号。这是一项原子操作,而且该功能设计为在并发环境中工作(许多人通过大量请求访问一个数据库)。
为了能够并发服务,MySQL 将事务彼此隔离,每个事务都生活在自己的“泡沫”中。这意味着,每次发生插入并生成 auto_increment 时,它无法为不同的查询生成相同的值。
实现这一点的唯一方法是 MySQL 始终增加该数字并且从不重复使用它。这是唯一可能的解决方案,也是最快的解决方案。
这是什么意思 - 这意味着每次您在查询中遇到唯一约束时,为 auto_increment
生成的值将被“浪费”,插入不会发生,而是UPDATE
部分被执行。
你无法修复它,你只能破坏它。保持原样,你就做对了。
auto_increment
的作用只是提供唯一的数字。如果它们以某种方式被花掉了(由于插入失败)那么那很好,而不是您需要担心的事情。
关于php - 如何阻止行 ID 变大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35037881/