[英]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 TABLE
, ALTER 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.