【问题标题】:MySQL resets AUTO_INCREMENT for a table on service restartMySQL 在服务重新启动时为表重置 AUTO_INCREMENT
【发布时间】:2011-08-31 03:34:54
【问题描述】:

我有 MySQL (InnoDB) 数据库,它会在服务重新启动时重置它的自动增量值。这会导致重复的主键插入失败。

直到最近才发生这种情况。当一位同事不小心从数据库中删除了一个表时,它就开始发生了。单表是从备份中恢复的,但结构发生了一些变化(整数被双精度替换,vchars 变大了一些),现在每次重新启动 mysql 服务时都会重置自动增量。

表的创建模式是这样的:

CREATE TABLE `caseattachments` (
  `CaseAttachmentId` double NOT NULL AUTO_INCREMENT,
  `CaseId` double DEFAULT NULL,
  `CaseEventId` double DEFAULT NULL,
  `OriginalFileName` varchar(768) DEFAULT NULL,
  `OriginalFileMimeType` varchar(768) DEFAULT NULL,
  `OriginalFileSize` double DEFAULT NULL,
  `NewFileName` varchar(768) DEFAULT NULL,
  `Created` datetime DEFAULT NULL,
  PRIMARY KEY (`CaseAttachmentId`)
) ENGINE=InnoDB AUTO_INCREMENT=6589 DEFAULT CHARSET=latin1;

为什么每次重新启动服务时都会重置自动增量?

更新

对此的修复相当简单(在我的情况下)我删除了表并重建它以使用整数作为 Id。这似乎解决了这个问题。我不确定如果我有一张大桌子会解决什么问题,希望我不需要找出答案。

【问题讨论】:

  • 我还没有看到与AUTO_INCREMENT 一起使用的DOUBLE 类型。我认为它只用于整数类型,如 INT(4 个字节)、TINYINT(1 个字节)和 BIGINT(8 个字节),当一个表真的很大时。
  • @ypercube: 显然与浮点值一起使用是合法的:dev.mysql.com/doc/refman/5.1/en/create-table.html "整数或浮点列可以具有附加属性 AUTO_INCREMENT。当您插入 NULL 值时(推荐) 或 0 到索引的 AUTO_INCREMENT 列中,该列设置为下一个序列值。通常这是 value+1,其中 value 是表中当前列的最大值。AUTO_INCREMENT 序列从 1 开始。"

标签: mysql innodb auto-increment


【解决方案1】:

在这里:

AUTO_INCREMENT=6589

您的索引已重置为 6589,并且会重复,直到达到可用的数字,要么将其取出,要么确保其 1+ 表中的最后一个 id。

所以如果最后一行的 id 为 98120,你需要将其更改为

AUTO_INCREMENT=98121

还是我说的很明显?

如果它是当前问题并且您需要修复活动表,请执行以下操作:

ALTER TABLE caseattachments AUTO_INCREMENT = 98121

【讨论】:

  • AUTO_INCREMENT 值大于当前最大值。我看到的是重启后插入的下一个值是 1,而不是 6589。
  • 您是否使用一些参数重新启动服务?你有用于重启mysql的命令的例子吗?另外,您使用的是什么版本的 MySQL?
猜你喜欢
  • 1970-01-01
  • 2015-01-31
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2019-08-23
相关资源
最近更新 更多