MySQL在事务中重置AUTO_INCREMENT

时间:2014-05-28 19:22:27

标签: php mysql sql transactions

一些背景

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

实际问题

我需要一种方法来重置AUTO_INCREMENT作为事务的一部分。无法使用TRUNCATE TABLEALTER TABLE等任何DDL命令,因为它们会立即应用,而不是交易的一部分。

1 个答案:

答案 0 :(得分:2)

抱歉,没有使用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');

请注意,如果您有多个线程将数据重新加载到此表中,则会出现争用情况。即两个会话都可以尝试插入相同的值。但我认为你可以控制它,而且你一次只能在一个会话中重新加载数据。