2011-05-23 88 views
1

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

直到最近才发生这种情况。当同事不小心从数据库中删除一张表时,它开始发生。单个表已从备份中恢复,但结构稍有变化(整数替换为double,vchar增大了一些),并且每次重新启动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; 

自动递增为什么可能会得到每次重新启动服务时复位?

UPDATE

对此问题进行修复是相当微不足道的(在我的情况)我删除的表并重建它使用的Id的整数。这似乎解决了问题。我不知道如果我有一张大桌子会有什么修复,希望我不需要知道。

+1

我还没有看到有'AUTO_INCREMENT'使用'DOUBLE'类型。当我有一个真正的大表时,我认为它只使用了整型,比如'INT'(4字节),'TINYINT'(1字节)和'BIGINT'(8字节)。 – 2011-05-23 15:21:38

+1

@ypercube:显然它是合法的使用浮点值:http://dev.mysql.com/doc/refman/5.1/en/create-table.html“一个整数或浮点列可以有附加属性AUTO_INCREMENT当你将一个NULL值(推荐值)或0插入一个索引的AUTO_INCREMENT列时,该列被设置为下一个序列值,通常这是值+ 1,其中value是当前列的最大值表。AUTO_INCREMENT序列从1开始。“ – 2011-05-23 16:06:09

回答

1

它的位置:

AUTO_INCREMENT=6589 

你的指数已恢复到6589,并会尽重复,直到达到其可数,任取了这一点,或确保其1+最后的ID在桌子。

因此,如果最后一行已编号98120,悠需要将其更改为

AUTO_INCREMENT = 98121

还是我说明明显?

如果当前的问题,你需要修复现场表做:

ALTER TABLE caseattachments AUTO_INCREMENT = 98121 
+0

AUTO_INCREMENT值大于当前最大值。我看到的是,在重新启动后,插入的下一个值是1,而不是6589. – ilivewithian 2011-05-23 13:33:40

+0

您是否使用某些参数重新启动服务?你有一个用于重启mysql的命令的例子吗? 另外,你使用的是什么版本的MySQL? – 2011-05-23 15:46:18