如何阻止行ID变大

时间:2016-01-27 12:49:17

标签: php mysql database

我有这个代码,它解析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值不断增加。我错过了什么?

感谢。

2 个答案:

答案 0 :(得分:1)

在解释之前:您遇到的是正常

为每个id查询生成INSERT个数字。这是一个原子操作,加上该功能被设计为在并发环境中工作(许多人用一大堆请求命中一个数据库)。

为了能够同时服务,MySQL将事务彼此隔离,并且每个事务都将其视为自己的“泡沫”。这意味着,每次插入发生并生成auto_increment时,不能为不同的查询生成相同的值

实现这一目标的唯一方法是让MySQL始终增加数量并且永远不会重复使用它。这是唯一可行的解​​决方案,也是最快的解决方案。

这是什么意思 - 这意味着每次在查询中遇到唯一约束时,为auto_increment生成的值都将“浪费”,插入不会发生,而是{{1部分被执行。

你无法解决它,你可以打破它。保持原样,你做得对。

UPDATE的工作只是提供唯一的数字。如果他们以某种方式花费了(通过插入失败)那么这很好,而不是你需要担心的事情。

答案 1 :(得分:0)

每次“更新”行时,

ON DUPLICATE KEY UPDATE都会创建一个新行。

如果您不希望它如此,则必须提出两个查询:一个用于INSERT查询,另一个用于UPDATE查询。