我想知道是否有任何方法可以选择未在一系列数字中使用的第一个数字,类似于使用MAX()来选择最高数字。
假设您有一个列“id”,并插入1,2,3,5,6,8,10,......
如果使用MAX(),它将返回10.有没有办法选择SELECT 4(因为它是第一个空闲数字),填充4然后选择SELECT 7(5,6已被采用,因此7将是接下来...)
提前谢谢! :)
答案 0 :(得分:5)
这应该这样做 -
SELECT t1.id + 1
FROM tbl t1
LEFT JOIN tbl t2
ON t1.id + 1 = t2.id
WHERE t2.id IS NULL
ORDER BY t1.id ASC
LIMIT 1
答案 1 :(得分:2)
尝试此查询
SELECT MIN(table0.id)+1 AS newid
FROM tst AS table0
LEFT JOIN tst table1 ON table1.id=table0.id+1
WHERE table1.id IS NULL
答案 2 :(得分:1)
这是对Dojo答案的修改。它避免使用多个结果集。
set @i=0;
select max(if(@i=id,@i:=id+1,@i)) from tb1 order by id;
我更喜欢这个答案,因为它让我可以选择一个起点来开始寻找缺失的数字。
答案 3 :(得分:0)
你想做什么?如果您尝试为要插入的新行创建唯一ID,则有更好的方法可以执行此操作。
您可以执行nnichol建议的操作,或者如果您不想加入,则可以执行此操作:
set @i=0;
select if(@i=id,@i:=id+1,@i) from tb1 order by id;
select @i;
如果您有一个大表并且不想加入,那么非常有用。
注意:这会返回多个结果集。您的应用代码应该使用正确的代码。 出于安全原因,默认情况下可能会禁用多行查询,您必须在驱动程序或数据库配置中覆盖这些设置(小心)。