php - 如何阻止行 ID 变大

标签 php mysql database

我有这段代码,它解析 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/

相关文章:

MySQL创建表和更改(添加)表查询

database - 删除记录后如何释放vertica原始空间

php - 将动态内容添加到 codeigniter 中的模板

php - 由 Ajax 改变的大整数

php - 如何从用户获取多行输入并在 PHP 中显示相同内容

mysql - 一个表中的多条记录基于另一表中的 id

java - solr连接mysql出错

php - 使用 PHP 和 MySQL 单击产品图像显示产品详细信息

Android 打开或创建数据库

php - 使用 DateTime 获取日期时间从 date() 函数返回不同的值