【问题标题】:INSERT IGNORE increases auto increment counter even no record is added?即使没有添加记录,INSERT IGNORE 也会增加自动增量计数器?
【发布时间】:2012-05-06 08:02:03
【问题描述】:

MySQL 中,我使用INSERT IGNORE 语句将行插入到表中。因为一列是UNIQUE,所以没有插入一些行(因为它们已经存在)。执行该语句后,我注意到自动增量列在行之间缺少一些数字,后来我意识到这是由于行被忽略且未添加而发生的。

如果没有使用IGNORE 子句插入行,是否可以设置系统不增加自动递增计数器

【问题讨论】:

  • 你用的是什么版本的 MySQL?
  • auto_increment 列中缺少数字不是问题。它们永远不能保证没有间隙。忽略它。
  • @eggyal - mysql Ver 14.14 Distrib 5.5.20,适用于使用 readline 5.1 的 Linux (i686)
  • 更好的措辞是:“未添加记录时重置计数器”。文档中没有任何内容表明自动递增的整数会被自动重用。
  • @stackoverflow - 我说的正好相反:文档提到计数器在增加后会自动减少的任何特殊情况。我知道的所有重置都是手动的:ALTER TABLETRUNCATE TABLE...

标签: mysql sql insert auto-increment


【解决方案1】:

引用manual page for INSERT:

如果您使用 IGNORE 关键字,则在执行 INSERT 语句被视为警告。例如,没有 IGNORE,复制现有 UNIQUE 索引或 PRIMARY KEY 的行 表中的值导致重复键错误,语句为 中止。使用 IGNORE,该行仍然没有插入,但没有错误 发布。

INSERT IGNORE 语法只是一种抑制某些错误消息的方法,当您意识到这些错误可能会发生和/或希望在稍后阶段处理它们时,它会很有帮助。在幕后,你仍然有一个常规的插入,除了它由于违反键而失败。 MySQL 需要实际的行值来进行插入,AUTO_INCREMENT 计数器将根据regular rules 递增:

  1. 该列的值为 NULL。
  2. 未设置该列的值。
  3. 列的值大于计数器。

因此,除非您可以重新考虑您的逻辑(例如,在进行插入之前测试键值是否存在),否则重置计数器的唯一方法是ALTER TABLE

ALTER TABLE t2 AUTO_INCREMENT = value;

【讨论】:

  • 正确的说法是什么?以下语句有语法错误:ALTER TABLE `table` AUTO_INCREMENT = (SELECT MAX(LAST_INSERT_ID(id)) FROM `table`)。请指教。
  • 我想ALTER TABLE 不期望子查询。如果变量不能解决问题,您始终可以编写动态 SQL。不管怎样,这种方法看起来像是最后的手段恕我直言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
相关资源
最近更新 更多