当前位置: 首页 > 面试题库 >

为什么失败插入时MySQL自动增加?

盛建德
2023-03-14
问题内容

一位同事让我意识到了一个非常奇怪的MySQL行为。

假设您有一个表,其中包含一个auto_increment字段和另一个设置为唯一的字段(例如,用户名字段)。尝试插入表中已有用户名的行时,插入失败,正如预期的那样。然而,几次尝试失败后插入有效的新条目时,可以看到auto_increment值增加了。

例如,当我们的上一个条目如下所示时…

ID: 10
Username: myname

…并且在下一次插入时尝试使用相同的用户名值尝试五个新条目,我们将创建一个新行,如下所示:

ID: 16
Username: mynewname

尽管这本身并不是什么大问题,但是通过将失败的插入请求充斥到表中杀死表似乎是一个非常愚蠢的攻击手段,如《 MySQL参考手册》所述:

“如果该值变得大于可以以指定整数类型存储的最大整数,则不会定义自动递增机制的行为。”

这是预期的行为吗?


问题答案:

InnoDB 是一个交易引擎。

这意味着在以下情况下:

  1. Session A 插入记录 1
  2. Session B 插入记录 2
  3. Session A 回滚

,则存在间隙的可能性,或者session B将锁定直到session A提交或回滚。

InnoDB 设计人员(与大多数其他事务引擎设计人员一样)选择留出空隙。

文档中

访问自动增量计数器时,请InnoDB使用特殊的表级AUTO- INC锁,该锁保留在当前SQL语句的末尾,而不是事务的末尾。引入了特殊的锁定释放策略,以提高插入到包含AUTO_INCREMENT列的表中的并发性

InnoDB只要服务器运行,就使用内存中自动增量计数器。如前所述,当服务器停止并重新启动服务器后,请InnoDB为每个表的第一个表重新初始化计数器INSERT

如果您担心id列会缠绕,请使其BIGINT(8字节长)。



 类似资料:
  • 问题内容: 当我从用户那里接收数据时,我每次都会验证输入的格式(PHP)。我唯一无法验证(或我不想)的是约束(例如外键)违规。我让DML引发并出错,并让数据库驱动程序引发异常。捕获它后,我只是通过MySQL的错误代码打印出一些错误消息。 问题是,即使插入失败,我仍然看到序列还在增长。我该如何预防呢? 问题答案: 这就是自动增量值和序列的工作方式。使用值时,如果事务失败,则不会回收该值,并且会回滚该

  • 我在下面的代码中创建了一个表: 此外,我有记录从csv文件导入到表。我想插入一个新的记录到表我一直得到这个错误 错误:重复的键值违反了唯一约束"salesorderdetail_pkey"DETAIL: Key(SalesorderDetid)=(2)已经存在。********** 错误 ********** 错误:重复的键值违反唯一约束“salesorderdetail_pkey”SQL状态:2

  • 问题内容: 我在看初学者的Tensorflow MNIST示例 ,发现在这一部分中: 将批次大小从100更改为204以上会导致模型无法收敛。它可以工作到204,但是在205以及我尝试的任何更高数字下,精度最终都将小于10%。这是错误,还是关于算法的问题,还是其他问题? 这正在运行他们的OS X二进制安装,似乎是0.5.0版。 问题答案: 您在初学者示例中使用的是非常基本的线性模型吗? 这是调试它的

  • 问题内容: 我正在使用较大的随机数作为密钥(来自另一个系统)。在相当小的表(如几百万行)上进行插入和更新所花费的时间比我认为合理的长得多。 我已经提炼了一个非常简单的测试来说明。在测试表中,我尝试使其尽可能简单。我的真实代码没有如此简单的布局,并具有关系和附加索引等。但是,更简单的设置将显示等效的性能。 结果如下: 在MyISAM中插入1M行需要6秒钟;进入InnoDB需要 3433秒 ! 我究竟

  • 笔记: 必须安装Java。获取JRE(http://www.java.com)或者JDK 从环境变量JAVA_HOME(C:\Program Files\Java\jdk1.8.0_251)...13:07:44.382[main]ERRORegistry.java:35ServiceDiscoveryIorg.kie.api.KieService: 131-加载失败,因为已经存在一个服务ervi

  • 问题内容: 使用MySQL 5.1.49,我正在尝试实现一个标记系统,我的问题是有两列的表:, (InnoDB) 使用query时,即使忽略了插入,自动增量值也会增加。 通常,这不会有问题,但是我希望有很多尝试为该特定表插入重复项,这意味着我下一个新行字段的值将跳得太多。 例如,我最终得到一个表,该表具有3行,但错误的是 另外,如果我不做而只是定期做并处理错误,则自动递增字段仍会增加,因此下一个真