繁体   English   中英

MySQL在事务中重置AUTO_INCREMENT

[英]MySQL reset AUTO_INCREMENT in a transaction

一些背景

我有一个使用InnoDB的数据库表,它将只有8行。 使用(无符号)tinyint作为主键是有意义的。 现在,该表的数据来自外部来源,并且该表基本上是该数据的缓存。 每隔24小时左右,我们需要获取一个新数据,从表中删除旧数据,并用新数据填充它。 发生这种情况时,我们希望先前的数据可用于其他连接,因此在最后使用事务和提交是有意义的。 现在,事实证明TRUNCATE TABLE重置AUTO_INCREMENT但是它被视为DDL且会自动提交并且不能成为事务的一部分,因此我们使用DELETE FROM TABLE 但这不会重置AUTO_INCREMENT 因此,这将是第32次发生ID不足的情况。

实际问题

我需要一种将表重置为事务的一部分的AUTO_INCREMENT的方法。 不能使用任何DDL命令,例如TRUNCATE TABLEALTER TABLE等,因为它们将立即应用而不是事务的一部分。

抱歉,如果不使用DDL,将无法重置自动增量。

但是您可以使用DML插入所需的任何值,以覆盖自动增量。

因此,您可以手动生成8个id值。

例如,这是一种方法:

SET @id = 0;
INSERT INTO little_table VALUES
(@id:=@id+1, 'data'),
(@id:=@id+1, 'data'),
(@id:=@id+1, 'data'),
(@id:=@id+1, 'data'),
(@id:=@id+1, 'data'),
(@id:=@id+1, 'data'),
(@id:=@id+1, 'data'),
(@id:=@id+1, 'data');

请注意,如果您有多个线程将数据重新加载到该表中,则这是竞争条件。 即两个会话都可以尝试插入相同的值。 但是我假设您对此有控制权,并且一次只能在一个会话中重新加载数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM