如何重用auto_increment值?

时间:2012-03-16 19:06:35

标签: mysql database auto-increment

  

可能重复:
  Fragmentation of id's (auto_increment column) in mysql

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

主题ID 9 8 7 6 五 4 3 2 1

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

主题ID 9 8 7 4 3 2 1

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

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

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

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

感谢。

6 个答案:

答案 0 :(得分:18)

MySQL 4294967295中的最大INT数,如果每分钟创建1000个线程,则每天需要1440000(1000 x 60 x 24)个id。因此,大约8。7年后你会用完ids。

BIGINT的最大数量是18446744073709551615,这足以为 35 096年创建 1000000000(10亿)每分钟

所以你可以随心所欲地浪费id而不用担心它们。

答案 1 :(得分:5)

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

以下是我们如何做到的。

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

答案 2 :(得分:2)

帮自己一个忙,忘掉这个。实施这将是一个大规模的痛苦,所以除非有一个非常令人信服的目标实现,否则不可能接近(不太可能),我们正在谈论巨大的痛苦,没有收获。

MySql本身并不支持这种情况正是出于这个原因:大规模并发症没有任何好处。

答案 3 :(得分:2)

  

它包含唯一 ID,为每个线程提供区别。

你是这么说的。
唯一身份。为了区别。

你如何称呼id是唯一的?
当今天某个主题有一个id和第二天 - 另一个主题时,它可能有什么区别呢? 你怎么能找到它?
你如何将它链接到其他线程?

试着想一想这些词的含义。它之所以被称为 unique

尽量不要把孩子想要“整洁”和“可爱”的东西只是为了享受,但作为一个成年人,他们可以看到后果。

尝试向更有经验的人学习倾听,并遵循他们的知识和经验建议,而不仅仅是你的想法。

答案 4 :(得分:0)

因此,对于参照完整性,我不建议重新使用ID。对于int和bigint的最大限制,您永远不应该用尽唯一值。唯一值是参考数据库的核心。

话虽如此,您可以运行搜索子例程(或代替触发器)来查找最低的可用ID。然后暂时关闭标识插入,插入数据,然后重新打开标识插入。

有很多理由不这样做!其中包括当同时有多个值进入时插入数据之间的所有潜在冲突。

答案 5 :(得分:-1)

除非整个表被截断,否则MySQL将维护ID的顺序。删除行不会影响最后一个ID。