我有一个使用InnoDB的数据库表,它只有8行。使用(unsigned)tinyint作为主键是有意义的。现在,该表的数据来自外部源,该表基本上是该数据的缓存。每24小时(左右)我们需要获取新数据,从表中删除旧数据并用新表填充。在发生这种情况时,我们希望以前的数据可用于其他连接,因此在最后使用事务和提交是有意义的。现在,事实证明TRUNCATE TABLE
重置AUTO_INCREMENT
,但它被视为DDL并自动提交,不能成为交易的一部分,因此我们使用DELETE FROM TABLE
。但这并没有重置AUTO_INCREMENT
。因此,我们将在第32次发生这种情况时耗尽ID。
我需要一种方法来重置AUTO_INCREMENT
作为事务的一部分。无法使用TRUNCATE TABLE
,ALTER TABLE
等任何DDL命令,因为它们会立即应用,而不是交易的一部分。
答案 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');
请注意,如果您有多个线程将数据重新加载到此表中,则会出现争用情况。即两个会话都可以尝试插入相同的值。但我认为你可以控制它,而且你一次只能在一个会话中重新加载数据。