Php MySQL在事务中重置自动增量 一些背景

Php MySQL在事务中重置自动增量 一些背景,php,mysql,sql,transactions,Php,Mysql,Sql,Transactions,我有一个DB表,使用InnoDB,它只有8行。对主键使用未签名的tinyint是有意义的。现在,表的数据来自外部源,表基本上是该数据的缓存。大约每24小时,我们需要获取新数据,从表中删除旧数据并用新数据填充。在这种情况下,我们希望前面的数据可用于其他连接,因此在最后使用事务和提交是有意义的。现在,TRUNCATE TABLE重置了自动增量,但它被视为DDL并自动提交,不能成为事务的一部分,所以我们使用DELETE FROM TABLE。但这不会重置自动增量。因此,我们将在第32次出现这种情况时用

我有一个DB表,使用InnoDB,它只有8行。对主键使用未签名的tinyint是有意义的。现在,表的数据来自外部源,表基本上是该数据的缓存。大约每24小时,我们需要获取新数据,从表中删除旧数据并用新数据填充。在这种情况下,我们希望前面的数据可用于其他连接,因此在最后使用事务和提交是有意义的。现在,TRUNCATE TABLE重置了自动增量,但它被视为DDL并自动提交,不能成为事务的一部分,所以我们使用DELETE FROM TABLE。但这不会重置自动增量。因此,我们将在第32次出现这种情况时用完ID

实际问题
我需要一种方法来重置作为事务一部分的表的自动增量。无法使用任何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');

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

在您的场景中,我根本不会使用自动增量。如果可能,您可以在information schema.TABLES中修改自动增量值,但伪数据库是只读的。唯一切实可行的办法就是做你的改变。否则就不用罐头了。因为您需要大于0-255的值,所以请使用较大的字段,例如int或bigint。@VMai-Hmm,您建议使用不带自动递增的主键。如果是,我应该在每行的PK列中插入什么?插入表格ID,。。。值从表中选择MAXid+1。。。?自动增量感觉更自然,不是吗?见比尔·卡温的答案谢谢,这很有效。这实际上使插入速度加快了一点。感谢大家对比赛条件的关注。将只有一个线程执行此操作。而且,整个事情都是作为交易的一部分完成的,所以要么全有,要么什么都没有。