在mysql表中找到最小未使用值

时间:2011-06-24 07:21:12

标签: mysql

我有一个像这样的MySQL表:

+--------+-------+
| Server | Port  |
+--------+-------+
| 1      | 27001 |
| 2      | 27002 |
| 4      | 27004 |
+--------+-------+

你怎么看 - 这里是27003端口 - 但它被删除了一段时间(仅举例)。

有没有办法知道mysql表中未使用的最小值(例如高于27000)? 或者没有办法,我需要制作一个单独的表,所有端口和列都使用“used”或“not used”?

情况说明:我正在创建游戏托管网站,我可以使用自动增加端口,但是我会在一段时间后有很多已删除/未使用的端口,我想在增加端口范围之前使用所有这些端口

3 个答案:

答案 0 :(得分:14)

在Google上快速搜索“first missing number from sequence mysql”可获得this page of common MySQL queries

它向您展示了如何find the first missing number from a sequence

你有一个带有值(1,2,4,18,19,20,21)的表tbl(id int),你希望在它的id值序列中找到第一个缺失的数字:< / em>的

SELECT t1.id+1 AS Missing 
FROM tbl AS t1 
LEFT JOIN tbl AS t2 ON t1.id+1 = t2.id 
WHERE t2.id IS NULL 
ORDER BY t1.id LIMIT 1; 

+---------+ 
| Missing | 
+---------+ 
|       3 | 
+---------+ 

答案 1 :(得分:1)

SELECT *
FROM tableName t, (SELECT @last:= NULL) dm
WHERE (@last:= IF(@last IS NULL OR @last + 1 = ID, ID, NULL)) IS NULL
ORDER BY ID
LIMIT 1

答案 2 :(得分:0)

我很高兴在2011年回答了这个问题-从MySQL 5.7开始,它似乎比左联接解决方案更具可读性,并且(按照15M行的表中的说明)更快:

select min(id+1) from tbl
where id+1 not in (select id from tbl)

请注意,上述操作也会使您获得max(id)+1,但您可以免费排除它:

select min(id+1) from tbl
where id+1 not in (select id from tbl)
and id < (select max(id) from tbl)