Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查找不存在的最低ID_Mysql_Sql - Fatal编程技术网

Mysql 查找不存在的最低ID

Mysql 查找不存在的最低ID,mysql,sql,Mysql,Sql,我有一个表,其中每一行都有一个id,每次我插入一个新行时,它会使用最高的id并添加1。但是,我希望新行收回删除的行所允许的数量。如何找到不存在的最低id?谢谢您可以使用“自动增量”来获取唯一递增的ID,但它们通常不会重复使用。您从重用旧值中获得了什么好处 Ref:您可以使用AUTO_INCREMENT获得唯一递增的ID,但它们通常不会被重用。您从重用旧值中获得了什么好处 参考:不要重复使用以前使用过的id值。 示例场景: 假设你的网站有一个恶意用户,他发送了挑衅性的电子邮件。电子邮件引用用户的

我有一个表,其中每一行都有一个id,每次我插入一个新行时,它会使用最高的id并添加1。但是,我希望新行收回删除的行所允许的数量。如何找到不存在的最低id?谢谢

您可以使用“自动增量”来获取唯一递增的ID,但它们通常不会重复使用。您从重用旧值中获得了什么好处


Ref:

您可以使用AUTO_INCREMENT获得唯一递增的ID,但它们通常不会被重用。您从重用旧值中获得了什么好处


参考:

不要重复使用以前使用过的id值。

示例场景:

  • 假设你的网站有一个恶意用户,他发送了挑衅性的电子邮件。电子邮件引用用户的主键号。您删除了用户的违规帐户,但电子邮件仍然存在。您将删除的id重新分配给一个新的、友好的用户,但他不断收到关于过去滥用电子邮件的投诉,而他对此不负责
自动增量值应是唯一的,但无需连续

32位有符号整数最多可以是231-1或2147483647。64位有符号整数最多可以是263-1或9223372036854775807。您不太可能用完所有整数

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


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

不要重复使用以前使用过的id值。

示例场景:

  • 假设你的网站有一个恶意用户,他发送了挑衅性的电子邮件。电子邮件引用用户的主键号。您删除了用户的违规帐户,但电子邮件仍然存在。您将删除的id重新分配给一个新的、友好的用户,但他不断收到关于过去滥用电子邮件的投诉,而他对此不负责
自动增量值应是唯一的,但无需连续

32位有符号整数最多可以是231-1或2147483647。64位有符号整数最多可以是263-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:

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

尝试以下方法:

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


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

您可以在同一个表上使用
左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

您可以在同一个表上使用
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

不要这样做。自动递增的主键不应该弄乱。它确实是重复的。威尔:这是个坏主意。首先,您可以让您的mysql引擎负责创建唯一标识符(id),但不建议您自己这样做。第二,id必须是唯一的,甚至被删除的行也必须有自己的id。例如,当您有一个id为3的用户名为william,您删除该用户并插入一个名为jan的新用户。william愿意看到他的数据并在其id为3的搜索上搜索,他会突然发现有关jan的信息。您不能这样做,让mysql完成任务使用auto Increments可进一步说明如何执行此操作。MySQL将使用一个自动递增字段来确保在生成它们时它们是唯一的。如果您尝试重用一个已释放的id,则可能会有两条语句同时检索相同的id,并且两条语句都试图使用它。不要这样做。自动递增的主键不应该弄乱。它确实是重复的。威尔:这是个坏主意。首先,您可以让您的mysql引擎负责创建唯一标识符(id),但不建议您自己这样做。第二,id必须是唯一的,甚至被删除的行也必须有自己的id。例如,当您有一个id为3的用户名为william,您删除该用户并插入一个名为jan的新用户。william愿意看到他的数据并在其id为3的搜索上搜索,他会突然发现有关jan的信息。您不能这样做,让mysql完成任务使用auto Increments可进一步说明如何执行此操作。MySQL将使用一个自动递增字段来确保在生成它们时它们是唯一的。如果你尝试重新使用一个已经释放的id,你可能会有两条语句同时检索同一个id,并且两条语句都试图使用它。人们太迷恋id号了。大多数情况下,它们不应该直接暴露给用户。如有必要,添加一个可展示的“序列号”,该序列号纯粹是装饰性的,可以根据需要进行调整,而无需拧紧