我有一个表,其中每一行都有一个 id,每次插入新行时,它都会使用最高的 id 并加 1。但是,我希望新行取回被删除的行所允许的数字。如何找到不存在的最低 id?谢谢
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
不要重复使用以前使用过的 id 值。
示例场景:
- 假设您的网站有一个滥用用户发送挑衅性电子邮件。电子邮件引用用户的主键编号。您删除了违规用户的帐户,但电子邮件仍然存在。您将已删除的 id 重新分配给一个新的好用户,但他不断收到有关他不负责的过去滥用电子邮件的投诉。
自动增量值应该是唯一的,但不需要它们是连续的。
一个 32 位有符号整数最多可以是 2 31 -1 或 2147483647。一个 64 位有符号整数最多可以是 2 63 -1 或 9223372036854775807。您不可能用完所有整数。
MySQL不取最高值加1。它分配序列中的下一个值。由于插入失败、行被删除或事务回滚,您可能会丢失值。这个是正常的。如果您尝试解决它,您的应用程序将变得缓慢而复杂。您应该按照设计使用自动增量功能,并接受不可避免的差距。
例外:如果您重新启动 MySQL 服务,InnoDB 的自动增量值将重置为 MAX(id)+1。
尝试这个:
select id+1
from users
where (id+1) not in (select id from users) limit 1
SQLFiddle: http ://www.sqlfiddle.com/#!8/3e5a0/5
请注意,我同意其他人的观点,他们表示您应该决定这是否是一个好的设计。如果您可以选择不重复使用数字,我强烈建议您这样做...
您可以使用 AUTO_INCREMENT 来获取唯一递增的 ID,但它们通常不会被重用。重用旧值有什么好处?
参考:http ://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html