database - MySQL在插入新记录时跳过了一行

标签 database mysql

问题是 mysql 在我们服务器上的 CPU 上运行很高,并且持续了大约 15 分钟。当时,一些到达服务器的数据没有被插入到数据库中,而是提交了事务。

重启mysql后问题解决。

因此,这意味着即使事务已提交,表中也没有新行。证据是自动递增的主键,应该如下所示:

100
101
102

但目前是这样的:

100
102

因此记录 101 丢失并被跳过。

现在我需要找到该记录的某种日志(如果存在)。

我在mysqldump日志中尝试过,但那里没有记录。记录 101 仍然下落不明。

我需要找到一种方法来重新创建该事务并再次执行。

有人遇到过类似的问题吗?

代码基本上如下所示:

$db->autocommit(FALSE);

$sql = "INSERT INTO t (amount, datetime) VALUES ($amount, '$datetime')";
$db->query($sql);

$id = $db->insert_id;
$sql = "INSERT INTO tr (id, log) VALUES ($id, '$log')";
$db->query($sql);

$db->autocommit(TRUE);

最佳答案

事务很可能在序列已经增加后中止。从数据库的角度来看,这不是问题:自动递增列不需要按顺序包含所有 id。从代码/用户的角度来看,这也应该不是问题。如果您的代码需要连续的 ID(比如说出于审计目的),您将必须自己实现一个系统。如果您不需要,则只需再次运行事务即可。然后将创建 id 103(在您的情况下)。

关于database - MySQL在插入新记录时跳过了一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36138836/

相关文章:

SQL删除重复项,保存特定列的最低值

mysql - 使用日期格式的 INSERT ... SELECT

mysql - 如何使用django和falcon对单个数据库执行数据库操作

php - 如何使用 codeigniter 验证和插入多条记录

mysql - Laravel Fluent 查询 - 如何使用 Fluent 执行 'SELECT AS'?

mysql - 子表状态

database - 用于 flutter 而不是 sqflite 的任何替代 SQL

php - 使用数据库实用程序类将数据从 Codeigniter 批量导出到 CSV

mysql - 我应该如何处理 clojure 项目的 sql 模式管理?

php - 为类似 eBay 的 Web 应用程序设计数据库