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

为什么INSERT IGNORE递增auto_increment主键?

公冶兴文
2023-03-14
问题内容

我编写了一个Java程序来访问MySQL innodb数据库。

每当INSERT IGNORE语句遇到重复的条目时,“自动增量”主键就会递增。

这是预期的行为吗?我认为IGNORE不应该发生这种情况。这意味着,IGNORE实际上会产生写入新主键值的额外开销。

下表如下:

CREATE TABLE `tablename` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `rowname` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `rowname` (`rowname`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

谢谢!


问题答案:

从MySQL 5.1.22开始,这就是默认行为。

如果您想避免自动增量列中出现空白,可以将配置变量设置innodb_autoinc_lock_mode0(也称为“传统”锁定模式)。但是,由于此模式具有保持表锁直到INSERT完成的效果,因此可能会导致性能下降。

从InnoDB AUTO_INCREMENT锁定模式的文档中:

innodb_autoinc_lock_mode = 0 (“传统”锁定模式)

传统的锁定模式提供了与innodb_autoinc_lock_modeMySQL
5.1中引入配置参数之前相同的行为。由于语义可能存在差异,提供了传统的锁定模式选项以实现向后兼容性,性能测试以及解决“混合模式插入”问题。

在这种锁定模式下,所有“类INSERT”语句都将获得特殊的表级AUTO-INC锁定,以将其插入具有AUTO_INCREMENT
列的表中。此锁通常保留在语句的末尾(而不是事务的末尾),以确保为给定的INSERT语句序列以可预测和可重复的顺序分配自动递增值,并确保自动递增值任何给定语句分配的都是连续的。



 类似资料:
  • 问题内容: 我试图找出“最佳做法”,以确定是否要添加自动递增的整数作为表的主键。 假设我有一个表格,其中包含有关化学元素的数据。每个元素的原子序数是唯一的,并且永远不会改变。因此,与其对每列使用一个自动递增的整数,不如仅使用原子序数会更有意义,对吗? 如果我有一本书,那会是真的吗?我应该使用ISBN还是自动递增的整数作为主键?还是包含每个人的SSN的员工表? 问题答案: 关于Stack Overf

  • 问题内容: 我试图检查不同的输入并在java中创建无限循环,我发现一旦超过最大限制,它就会变成负数。我只是在无限循环中增加int … 码: 最后输出的价值是, 现在,为什么会变成负数? 问题答案: 为什么会变成负面? 因为这是在计算溢出时指定在Java中发生的事情。 JLS 15.18.2 “如果整数加法溢出,则结果是数学和的低阶位,以某种足够大的二进制补码格式表示。如果发生溢出,则结果的符号与整

  • 问题内容: 我正在尝试添加具有自动增量的主键。 我已经阅读了一些文档和其他问题-有和声明,但是不起作用。 这是我做的: 和 我怎么了 我只想将主键增加1。 问题答案: 是或多或少是一种列类型,所以说就像说,只是说: 如果您想自己创建序列,那么您想将序列中下一个值的默认值设为默认值,这意味着: 为了模拟通常的行为,您还需要使表拥有该序列: 阅读手册的“串行类型”部分可能会很有成果。 我还建议您不要对

  • 我有一个django模型,它的id开始奇怪地增加。 列的后缀定义(从詹戈模型生成): 然后我通过django管理员创建了一个新记录: 然后我创建了一个新记录,它跳过了值17224,并插入了主键17225: 有人知道为什么会发生这种情况吗?应用程序此时并不关心,因为id仍在增加,但是在过去的几个新对象中,PKs已经从427跳过-

  • 我将向一个SQL Server表中添加一行,该表的主键列是自动递增的(< code>identity)。当我以编程方式向表中插入一个新行时,有没有办法获得所添加行的键值,因为我想在另一个相关表中将它用作外键?

  • 问题内容: 我对mysql有一个奇怪的问题。 我正在尝试更改表的列,该列是主键,并且对它定义了auto_increment约束。这也是其他多个表的外键参考。我需要在父级和所有子级中都更改此列的长度。 这将删除父表上的自动增量。添加约束的最佳方法是什么? 以下似乎失败了。 有没有更好的方法来实现这一目标? 编辑:显示创建为(更改后): 变更之前 谢谢! 问题答案: 您无需在MODIFY语句中指定: