繁体   English   中英

在MySQL中重置AUTO_INCREMENT值以避免竞争情况

[英]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值设置为小于当前现有数据的值。

听起来MySQL不是满足您需求的正确工具。 对于队列,有更好的系统,例如RabitMQ 您可以使用Redis以非常快速的方式保存数据。

最好使用正确的工具来解决问题。

MySQL的另一种方法是将列类型更改为具有更多可能的id的格式,例如bigint

怎么样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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM