【问题标题】:How to prevent mySQL from resetting auto increment value?如何防止 mySQL 重置自动增量值?
【发布时间】:2012-02-08 01:56:21
【问题描述】:

我有一张桌子可以制作临时 id`s 。当我删除表的所有行时,该表的自动增量值将重置为 0。但我不想重置自动增量。 我能做什么?

【问题讨论】:

  • 你用什么命令从表中删除行?
  • 为什么要从那里删除所有行?此外,正如@BrianGlaz 所暗示的那样,TRUNCATE 将导致自动增量被重置...
  • 您使用的是DELETE 语句还是TRUNCATE
  • 不要TRUNC。你可以使用ALTER TABLE tablename AUTO_INCREMENT=1234;
  • 我使用这个:mysql_query ("DELETE FROM tc_live_tables WHERE tid = '$tid'") 或死 (mysql_error());我的所有行都会删除,因为通常它们的 tid 相同。

标签: mysql auto-increment reset


【解决方案1】:

比较TRUNCATE TABLE:

任何 AUTO_INCREMENT 值都会重置为其起始值。这是真实的 即使对于 MyISAM 和 InnoDB,它们通常不重用序列 价值观。

...DELETE FROM:

如果删除包含最大值的行 AUTO_INCREMENT 列,该值不用于 MyISAM 或 InnoDB 桌子。如果使用 DELETE FROM tbl_name 删除表中的所有行 (没有 WHERE 子句)在自动提交模式下,序列重新开始 适用于除 InnoDB 和 MyISAM 之外的所有存储引擎。有一些 InnoDB 表的这种行为的例外情况,如第 1 节所述 13.3.5.3,“InnoDB 中的 AUTO_INCREMENT 处理”。

对于 MyISAM 表,您可以指定 AUTO_INCREMENT 辅助列 在多列键中。在这种情况下,重用从 序列的顶部甚至出现在 MyISAM 表中。见章节 3.6.9,“使用 AUTO_INCREMENT”。

【讨论】:

  • MariaDB 也会出现同样的问题吗?
  • 我希望不会:我认为任何不同的行为都是错误。
【解决方案2】:

将自动增量值重置为 0 可能有几个原因。

原因 1

您使用TRANCATE table 清空表。 TRUNCATE 不仅会删除行,还会根据设计重置自动增量值。

请改用DELETE FROM table

原因 2

表引擎是 InnoDB。 InnoDB 不会在磁盘上存储自动增量值,因此当 MySQL 服务器关闭时会忘记它。当 MySQL 再次启动时,InnoDB 引擎以这种方式恢复自动增量值:SELECT (MAX(id) + 1) AS auto_increment FROM table。这是 a bug,即 MySQL 8.0 版中的 fixed

更改表引擎:ALTER TABLE table ENGINE = MyISAM。或者在发布时将 MySQL 服务器更新到 8.0 版本。

【讨论】: