INSERT IGNORE increases auto increment counter even no record is added?
在 MySQL 中,我使用 INSERT IGNORE 语句向表中插入行。因为一列是 UNIQUE,所以没有插入一些行(因为它们已经存在)。执行该语句后,我注意到自动增量列在行之间缺少一些数字,后来我意识到这是由于行被忽略且未添加而发生的。
如果没有使用 IGNORE 子句插入行,是否可以设置系统不增加自动递增计数器?
- 您使用的是什么版本的 MySQL?
-
在 auto_increment 列中缺少数字不是问题。它们永远不能保证没有间隙。忽略它。
-
@eggyal - mysql Ver 14.14 Distrib 5.5.20,适用于 Linux (i686),使用 readline 5.1
-
更好的措辞是:"未添加记录时重置计数器"。文档中没有任何内容表明自动递增的整数会被自动重用。
-
@stackoverflow - 我说相反:文档没有提到计数器在增加后会自动减少的任何特殊情况。我知道的所有重置都是手动的:ALTER TABLE,TRUNCATE TABLE...
-
@stackoverflow - 我已经写了一个答案。
引用 INSERT 的手册页:
If you use the IGNORE keyword, errors that occur while executing the
INSERT statement are treated as warnings instead. For example, without
IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY
value in the table causes a duplicate-key error and the statement is
aborted. With IGNORE, the row still is not inserted, but no error is
issued.
INSERT IGNORE 语法只是一种抑制某些错误消息的方法,当您意识到这些错误可能发生和/或希望在稍后阶段处理它们时,它会很有帮助。在幕后,你仍然有一个常规的插入,除了它由于违反键而失败。 MySQL 需要实际的行值来进行插入,并且 AUTO_INCREMENT 计数器将根据常规规则递增:
该列的值为 NULL。
未设置列的值。
该列的值大于计数器。
因此,除非您可以重新考虑您的逻辑(例如,在进行插入之前测试键值是否存在),否则重置计数器的唯一方法是 ALTER TABLE:
- 什么是正确的陈述?以下语句有语法错误:ALTER TABLE `table` AUTO_INCREMENT = (SELECT MAX(LAST_INSERT_ID(id)) FROM `table`)。请指教。
-
我想 ALTER TABLE 不期望子查询。如果变量不能解决问题,您始终可以编写动态 SQL。无论如何,这种方法看起来像是最后的手段恕我直言。