我在使用MySQL Query时遇到一个奇怪的问题,我正在使用带有字段的表
slno,mobileno,承包商以slno作为主键和auto 增量序列1
,而测试说uptil 100记录计数和自动增量值相同,
所以我截断表重置自动增量并通过php插入一个包含大约40k数据的巨大excel文件,然后发出选择查询产生
预期的最大值为40000,但计数显示为39920
,我只是觉得很有趣,并试图找到谷歌,可能是我缺乏关键字搜索能力阻止我找到结果,所以我在这里张贴,为参考添加屏幕截图,任何想法和澄清。感谢
编辑: min slno是1
编辑: 在mysql中找到自动编号差距的解决方案的相关问题是asked and solved here。
答案 0 :(得分:2)
是特定情况,其中自动递增的值可能会丢失。例如,如果您回滚插入。根据{{3}}:
<强>&#34;失落&#34;自动递增值和序列间隙
在所有锁定模式(0,1和2)中,如果生成自动增量值的事务回滚,则这些自动增量值将丢失&#34;。一旦为自动增量列生成了一个值,它就无法回滚,无论是否类似INSERT&#34;语句已完成,以及是否回滚包含事务。这些丢失的值不会被重用。因此,存储在表的AUTO_INCREMENT列中的值可能存在间隙。
在这种情况下,虽然插入被撤消,但自动增量可能不是。这肯定会允许您从Excel批量插入偶尔失败并重试,随后重试工作。这实际上取决于插入过程的工作方式。
在任何情况下,假设这些值始终是连续的,实际上是坏假设。
这是因为,即使插入 保证是连续的,也可以删除行,这会导致出现间隙。你每次删除时都可以解决这个问题(或者就此问题进行批量插入),但是工作量很大 - 你基本上必须找到差距,然后移动&#34;更高的条目进入这些差距。
这种移动很可能是非平凡的,因为很可能会有其他表格对该列进行关键查找,并且每个表格也需要更改。
因此,自动增量字段的最佳用例只是为没有其他存在的行提供唯一标识符,并且不必须是连续的。