如何重用auto_increment值?

Vis*_*er7 5 mysql database auto-increment

可能重复:
mysql中id(auto_increment列)的碎片

我的数据库中有这个列.假设它的名字是'threadid'.它包含为每个线程分配的唯一ID.

threadid 9 8 7 6 5 4 3 2 1

假设我删除了ID为5和6的线程.

threadid 9 8 7 4 3 2 1

但是当删除后有一个提交时,给该线程的唯一ID是10.不是5.我认为这不是很整洁.

如何在列中获得尽可能少的值?(在这种情况下,5.)

我想我可以使用MIN()获得列的最小值并保持+1,直到我得到未使用的唯一值,但我认为这太复杂了.

有没有简单的方法来做到这一点?

谢谢.

Wol*_*ang 19

MySQL 4294967295中的最大INT数,如果每分钟创建1000个线程,则每天需要1440000(1000 x 60 x 24)个id.所以在大约8.17年后你会用完ids.

BIGINT的最大数量为18446744073709551615,这将是足以创造每分钟10亿(1十亿)的id35096年.

因此,你可以随心所欲地浪费id而不用担心它们.


Chu*_*urk 5

我同意其他人的意见,实现你自己找到最小的开放数字是一个非常糟糕的主意.但是在我工作的地方,我们会得到一组封闭的数字,当数字空闲时,我们必须重复使用.

这是我们如何做到的.

我们不删除行,但是将每列的所有值都设置为null,那么你要做的是SELECT min(id)WHERE columnA IS NULL,如果这返回了什么,我们重用,否则,插入一个新行.

  • 我看到很多潜在的死锁(多个并发连接尝试执行"插入")或只是普通的性能开销,首先必须首先检查是否有可用的空行,然后再插入.您刚刚增加了应用程序的复杂性,对于什么,序列号?做你自己和将继承这个应用程序的人是一个巨大的帮助而忘记这一点.此外,如果您使用外键,这实际上可能会创建一些可怕的不一致数据. (6认同)
  • 这已经是很久之后的事了,但是查克说,**在我工作的地方,我们得到了一组封闭的数字。** 他有非编程限制,迫使他使用非最佳实践解决方案。你应该感到庆幸的是,没有非程序员强加这样的限制。所以,请停止抱怨,让那些有政治/商业限制的人休息一下。OP 的质疑是有效的,而 Churk 的回答是一个聪明的解决方案。 (3认同)
  • @Devin已经说过了一个很好的方法来解决僵局. (2认同)
  • 我没有看到死锁问题,如果您在插入时使用显式表锁,则可以防止两个会话获得相同的数字。如果您简单地使用“SELECT id WHERE columnA IS NULL LIMIT 1”(假设列 A 上有索引),则此方法是可行的,只会造成轻微的性能损失。 (2认同)