[英]resetting AUTO_INCREMENT value in MySQL avoiding race condition
我知道我可以使用以下方法在MySQL中重置AUTO_INCREMENT值:
ALTER TABLE fooo AUTO_INCREMENT = 1;
但是,当表不为空时,是否可以避免更改值? 或者,我可以自动将其自动设置为当前的最大值+ 1吗?
我有一个队列表,该表由各个进程填充,并由另一个单独的进程处理的简单数据。 后者删除已处理的项目。 尽管新数据很快就会输入,但表格很可能会完全变空。
当前,自动增量值超过1,000,000,000,这迟早会导致进程中令人讨厌的整数溢出。 这就是为什么我正在寻找一种重置繁忙表的autoinc值的方法(在消耗/删除表中行的过程中)。
注意:因为这是一个队列,所以我必须绝对避免将autoinc值设置为小于当前现有数据的值。
怎么样LOCK TABLES fooo WRITE
,然后SELECT COUNT(*) FROM fooo
来检查表是否为空,并重置AUTO_INCREMENT
值(如果为空),然后UNLOCK TABLES
。 重复进行直到碰巧在表为空时将其锁定,然后设法执行重置。
使用MyISAM,只需使用ALTER
重置为1,它将自动使用下一个最高的。
对于InnoDB,自动重置并使用下一个最大值:
LOCK TABLES table WRITE;
SELECT COALESCE(MAX(id), 1) FROM table;
// Use value from SELECT in the ALTER
ALTER TABLE AUTO_INCREMENT = 99;
UNLOCK TABLES;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.