可能重复:
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,直到我得到未使用的唯一值,但我认为这太复杂了。
有没有简单的方法可以做到这一点?
感谢。
答案 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。