我在使用MySQL Query时遇到一个奇怪的问题,我在使用带有字段的表
slno,mobileno,以slno作为主键和auto的承包商
递增序列1
,而测试说uptil 100记录的计数和自动增量值相同,
所以我删节了表以重置自动增量,并通过php插入了一个包含约40k数据的巨大excel文件,然后发出了select查询,产生了
slno的最大值是预期的40000,但计数显示为39920
,我只是被逗乐了,试图在Google上查找,可能是由于我缺乏关键字搜索能力而无法找到结果,所以我在这里发布,以供参考添加屏幕快照,任何想法和说明。谢谢
编辑:
最小slno是1
编辑:
asked and solved here是与mysql中自动编号差距的解决方案相关的问题。
最佳答案
在某些特定情况下,自动递增的值可能会丢失。一个示例是如果您回滚插入。按照doco:
“丢失”的自动增量值和序列间隔
在所有锁定模式(0、1和2)中,如果生成自动增量值的事务回滚,则这些自动增量值将“丢失”。一旦为自动增量列生成了一个值,就无法回滚该值,无论是否完成“类似于INSERT的”语句,以及是否回滚包含的事务。这种丢失的值不会重复使用。因此,在表的AUTO_INCREMENT列中存储的值中可能存在间隙。
在这种情况下,尽管插页已退出,但自动增量可能不会。这肯定会考虑到您从Excel进行的批量插入有时会失败并重试的情况,随后的重试工作也可以进行。这实际上取决于插入过程的工作方式。
无论如何,假定这些值将始终是连续的实际上是一个错误的假设。
这是因为,即使保证插入是连续的,也可以删除将导致出现间隙的行。您肯定可以在每次删除(或批量插入)时解决此问题,但是工作量很大-您基本上必须找到差距,然后将更高的条目“移动”到这些差距中。
这种移动很可能是不平凡的,因为很可能会有其他表持有对该列的关键查询,并且每个表也都需要更改。
因此,自动递增字段的最佳用例是简单地为不存在其他行且不一定是连续行的行提供唯一的标识符。
关于php - MySQL自动递增并选择计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41819717/