我知道我可以使用
重置MySQL中的AUTO_INCREMENT值ALTER TABLE fooo AUTO_INCREMENT = 1;
但是,当表不为空时,我可以避免更改值吗?或者,我可以自动并原子将其设置为当前最大值+ 1?
我有一个队列表,由各种进程填充,其中包含由另一个单个进程处理的简单数据。后者删除已处理的项目。尽管新数据会很快进入,但表格可能会完全变空。
目前,自动增量值超过1,000,000,000,迟早会导致进程中出现令人讨厌的整数溢出。这就是为什么我正在寻找一种方法来重置繁忙表的autoinc值(在使用/删除表中行的过程中)。
注意:由于这是一个队列,我必须完全避免将autoinc值设置为低于当前现有数据的值。
答案 0 :(得分:0)
听起来有点MySQL不适合您的需求。对于队列,有更好的系统,例如RabitMQ。您可以使用Redis以非常快的方式保存数据。
使用正确的工具解决问题会更好。
MySQL的另一种方法是将列类型更改为具有更多可能ID的格式,例如bigint
。
答案 1 :(得分:0)
如何LOCK TABLES fooo WRITE
,然后SELECT COUNT(*) FROM fooo
来检查表格是否为空并重置AUTO_INCREMENT
值,如果是,则UNLOCK TABLES
。重复,直到你碰巧将表锁定为空,从而设法执行重置。
答案 2 :(得分:0)
使用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;