MySQL自动递增并选择计数

时间:2017-01-24 03:51:33

标签: php mysql count auto-increment

我在使用MySQL Query时遇到一个奇怪的问题,我正在使用带有字段的表

  

slno,mobileno,承包商以slno作为主键和auto   增量序列1

,而测试说uptil 100记录计数和自动增量值相同,

所以我截断表重置自动增量并通过php插入一个包含大约40k数据的巨大excel文件,然后发出选择查询产生

  

预期的最大值为40000,但计数显示为39920

,我只是觉得很有趣,并试图找到谷歌,可能是我缺乏关键字搜索能力阻止我找到结果,所以我在这里张贴,为参考添加屏幕截图,任何想法和澄清。感谢

enter image description here

编辑: min slno是1

enter image description here

编辑: 在mysql中找到自动编号差距的解决方案的相关问题是asked and solved here

1 个答案:

答案 0 :(得分:2)

特定情况,其中自动递增的值可能会丢失。例如,如果您回滚插入。根据{{​​3}}:

  

<强>&#34;失落&#34;自动递增值和序列间隙

     

在所有锁定模式(0,1和2)中,如果生成自动增量值的事务回滚,则这些自动增量值将丢失&#34;。一旦为自动增量列生成了一个值,它就无法回滚,无论是否类似INSERT&#34;语句已完成,以及是否回滚包含事务。这些丢失的值不会被重用。因此,存储在表的AUTO_INCREMENT列中的值可能存在间隙。

在这种情况下,虽然插入被撤消,但自动增量可能不是。这肯定会允许您从Excel批量插入偶尔失败并重试,随后重试工作。这实际上取决于插入过程的工作方式。

在任何情况下,假设这些值始终是连续的,实际上是假设。

这是因为,即使插入 保证是连续的,也可以删除行,这会导致出现间隙。你每次删除时都可以解决这个问题(或者就此问题进行批量插入),但是工作量很大 - 你基本上必须找到差距,然后移动&#34;更高的条目进入这些差距。

这种移动很可能是非平凡的,因为很可能会有其他表格对该列进行关键查找,并且每个表格也需要更改。

因此,自动增量字段的最佳用例只是为没有其他存在的行提供唯一标识符,并且必须是连续的。