Mysql 更新InnoDB表中的自动增量值

Mysql 更新InnoDB表中的自动增量值,mysql,Mysql,简短版本:我可以通过编程方式更新表格上的自动增量值吗?我试图通过mysql init_文件来实现这一点,所以它会在启动时发生,但我看不出它能工作 USE theDb; SELECT max(maxid) FROM (SELECT max(RegistrationId)+1 maxid FROM Registration UNION SELECT max(RegistrationId)+1 maxid FROM RegistrationArchive) t into @maxId; ALTER

简短版本:我可以通过编程方式更新表格上的自动增量值吗?我试图通过mysql init_文件来实现这一点,所以它会在启动时发生,但我看不出它能工作

USE theDb;

SELECT max(maxid) FROM (SELECT max(RegistrationId)+1 maxid FROM Registration
UNION
SELECT max(RegistrationId)+1 maxid FROM RegistrationArchive) t into @maxId;

ALTER TABLE Registration AUTO_INCREMENT=@maxId;
较长版本: 我有一个带有InnoDB表的mysql数据库。一个表(保存注册信息)有一个自动递增列,当处理一行时,它将复制到第二个存档表,并从第一个存档表中删除。存档表没有自动递增列。(顺便说一句,不是我的设计…)


问题是,当数据库由于某种原因重新启动时(这种情况很少发生),第一个表会重新计算下一个增量值——这是InnoDB的一个特性。该表通常为空或非常小,计算出的下一个增量将对应于已使用且在存档表中的id。数据被移动到存档状态正常,但随后的过程无法立即工作

我知道这很晚了,但询问之后,我发现sql语句的某些部分需要是文本,不能用用户定义的变量替换。如果需要更改SQL语句的这些部分,则需要使用

所以你需要这样做:

SET @`stmt_alter` := CONCAT('ALTER TABLE `Registration` AUTO_INCREMENT = ', @`maxId`);
PREPARE `stmt` FROM @`stmt_alter`;
EXECUTE `stmt`;
DEALLOCATE PREPARE `stmt`;

当前自动增量存储在
信息\u schema.tables.auto\u increment
中。但是我假设您的SQL只是更新了该值,所以如果一个不起作用,另一个也可能不起作用。但你可以试试,我可以直接在代码中完成,但仍然没有使用init_文件。我可以接受这个。至少,在代码中,版本控制已经到位。听起来问题是在执行init文件后重置自动增量。