找到不存在的最低ID

时间:2013-10-02 14:51:35

标签: mysql sql

我有一个表,其中每一行都有一个id,每次我插入一个新行时,它都会获得最高的id并添加1.但是,我想要新的行来取回所有行的数字。删除。如何找到不存在的最低ID?谢谢

4 个答案:

答案 0 :(得分:4)

您可以在同一张桌子上使用LEFT JOIN,并查看下一个ID是否存在 我不认为这个解决方案对于很多行来说真的很好,但它可以工作:

SELECT (t.id + 1)
FROM `table` as t
LEFT JOIN `table` s ON s.id = (t.id + 1)
WHERE s.id IS NULL
ORDER BY t.id
LIMIT 1

答案 1 :(得分:3)

请勿重复使用以前使用的ID值。

示例场景:

  • 假设您的网站有一个发送挑衅性电子邮件的滥用用户。电子邮件引用用户的主键号。您删除了用户的帐户违规行为,但电子邮件仍在那里。您将已删除的ID重新分配给一个新的,不错的用户,但他一直抱怨过去他不负责的滥用电子邮件。

自动增量值应唯一,但不需要连续

32位有符号整数最多可以为2 31 -1或2147483647.一个64位有符号整数最多可以为2 63 -1,或9223372036854775807.您不可能用尽所有整数。

MySQL没有取最高值并添加1.它在序列中分配下一个值。由于插入失败,行被删除或正在回滚的事务,您可能缺少值。这个是正常的。如果您尝试解决它,您的应用程序将变得缓慢而复杂。您应该按照设计使用自动增量功能,并接受将存在一些不可避免的差距。

例外:如果重新启动MySQL服务,InnoDB的自动增量值将重置为MAX(id)+1。

答案 2 :(得分:0)

您可以使用AUTO_INCREMENT获取唯一增加的ID,但通常不会重复使用它们。重用旧值会带来什么好处?

参考:http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

答案 3 :(得分:0)

试试这个:

select id+1
from users
where (id+1) not in (select id from users) limit 1

SQLFiddle:http://www.sqlfiddle.com/#!8/3e5a0/5

请注意,我同意其他人的意见,他们表示您应该决定这是否是一个好用的设计..如果您可以选择不重复使用数字,我强烈建议您这样做...