Mysql 检测(自动递增)序列中的缺失值
我有一个“Port”INT列,它应该在30000到50000之间 所以,我有一个插入值的存储过程(端口不为NULL)。因此,我必须选择“手动”存储在该字段上的值。问题是,尽管我可以在某个点增量插入(30003000130002…)一些条目被删除(它变成30000、30002、30004…),所以需要设置孔 我需要在SP中放置一种适合这些孔的方法(在我的示例中,它们是30000130003…)。我的问题是如何在SP内检查某个值是否已“应用” 我想使用MySQL中的循环。试过这样的方法:Mysql 检测(自动递增)序列中的缺失值,mysql,loops,Mysql,Loops,我有一个“Port”INT列,它应该在30000到50000之间 所以,我有一个插入值的存储过程(端口不为NULL)。因此,我必须选择“手动”存储在该字段上的值。问题是,尽管我可以在某个点增量插入(30003000130002…)一些条目被删除(它变成30000、30002、30004…),所以需要设置孔 我需要在SP中放置一种适合这些孔的方法(在我的示例中,它们是30000130003…)。我的问题是如何在SP内检查某个值是否已“应用” 我想使用MySQL中的循环。试过这样的方法: CREAT
CREATE PROCEDURE teste()
BEGIN
DECLARE p INT;
DECLARE aux INT;
SET p = 30000;
label1: LOOP
SELECT Port FROM Reg WHERE Port = p INTO aux;
IF p = 50000 THEN
LEAVE label1;
END IF;
IF aux IS NULL THEN -- aux-1 is not null, so I can verify the "next miminum available position"
aux = aux - 1;
LEAVE label1;
ELSE
SET p = p + 1;
ITERATE label1;
END IF;
END LOOP label1;
RETURN aux;
END $$
我的问题是获取结果值。如果我放置RETURN语句,我将得到只允许在函数上使用的信息。当我结束循环时,SELECT的结果总是空的
我能做什么?只需插入忽略30000到50000之间的所有值(假设字段上有唯一键)。在检测值是否存在方面,没有什么比DB本身更快了。以下是如何在序列中找到缺失的值
SELECT a.id+1 AS start, MIN(b.id) - 1 AS end
FROM seq AS a, seq AS b
WHERE a.id < b.id
GROUP BY a.id
HAVING start < MIN(b.id)
这意味着在id
序列中缺少值4,也缺少从7到9的数字(包括)
通过替换相应的名称来调整此代码以满足您的需要。您可以这样做吗
SELECT
MIN(Port + 1)
FROM
Reg
WHERE
Port + 1 NOT IN (
SELECT Port FROM Reg WHERE Port > 0
)
ORDER BY
Port ASC
因此,问题是:如何从序列中检测缺失的值?@SergeiTulentsev yes!我需要最小缺失值,以便下次输入时使用。太好了!非常感谢你。
SELECT
MIN(Port + 1)
FROM
Reg
WHERE
Port + 1 NOT IN (
SELECT Port FROM Reg WHERE Port > 0
)
ORDER BY
Port ASC
SELECT IFNULL(MIN(r1.Port) + 1, 30000) as minport
FROM Reg r1
LEFT JOIN Reg r2 ON r1.Port + 1 = r2.Port
WHERE r2.Port IS NULL: