MySQL 自动递增和选择计数

Posted

技术标签:

【中文标题】MySQL 自动递增和选择计数【英文标题】:MySQL auto increment and select count 【发布时间】:2017-01-24 03:51:33 【问题描述】:

我在使用 mysql Query 时遇到了一个奇怪的问题,我有一个包含字段的表

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

,虽然测试说 uptil 100 记录计数和自动增量值是相同的,

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

slno 的最大值是 40000,但计数显示为 39920

,我只是很开心并试图通过谷歌查找,可能是我缺乏关键字搜索能力阻止了我找到结果,所以我在这里发帖,为参考添加屏幕截图,任何想法和澄清。谢谢

编辑: 最小 slno 为 1

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

【问题讨论】:

min(slno) 是什么? 【参考方案1】:

种特殊情况会丢失自动递增的值。一个示例是,如果您回滚插入。根据doco:

“丢失”自动增量值和序列间隙

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

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


无论如何,假设这些值总是连续的实际上是一个错误的假设。

这是因为,即使插入保证是连续的,也有可能删除行,这会导致出现间隙。您当然可以在每次删除(或批量插入)时修复此问题,但工作量很大 - 您基本上必须找到差距,然后将更高的条目“移动”到这些差距中。

这种移动可能不是微不足道的,因为很可能会有其他表保存对该列的键查找,并且每个表都需要更改。

因此,自动递增字段的最佳用例是简单地为不存在其他行且必须连续的行提供唯一标识符。

【讨论】:

谢谢,paxdiablo,所以在我的情况下,尝试插入来自 excel 的 80 条随机记录但失败了,所以跳过了自动增量,对吗?随后导致另一个问题,我是否应该尝试捕获失败的记录并尝试重新插入它们并删除自动增量并使用手动计数 +1 之类的东西。 @sansknwoledge,请参阅我的最后一段。假设它们不会一定是连续的。一旦你放手,你的精神就会飙升:-)无论如何,如果没有间歇性错误,尝试再次插入它们不会比第一次更好。 抱歉英语不是我的母语,所以我在理解您的最后一段和评论时有些困难。你能简单地说一下我该怎么做吗,我很抱歉。 尽可能简单地说:完全忽略可能存在差距的事实。不要假设自动递增字段将始终具有连续值。

以上是关于MySQL 自动递增和选择计数的主要内容,如果未能解决你的问题,请参考以下文章

创建 Windows 自动重启 + 每次重启时递增的计数器

为啥 MySQL 从 1 计数而不是 0?

[ css 计数器 counter ] css中counter计数器(序列数字字符自动递增)应用问题讲解及实例演示

基于具有序列的条件递增计数器

重置 SQLite3/MySQL 中的行数计数

自动递增 - 每年自动重置