Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 检测(自动递增)序列中的缺失值_Mysql_Loops - Fatal编程技术网

Mysql 检测(自动递增)序列中的缺失值

Mysql 检测(自动递增)序列中的缺失值,mysql,loops,Mysql,Loops,我有一个“Port”INT列,它应该在30000到50000之间 所以,我有一个插入值的存储过程(端口不为NULL)。因此,我必须选择“手动”存储在该字段上的值。问题是,尽管我可以在某个点增量插入(30003000130002…)一些条目被删除(它变成30000、30002、30004…),所以需要设置孔 我需要在SP中放置一种适合这些孔的方法(在我的示例中,它们是30000130003…)。我的问题是如何在SP内检查某个值是否已“应用” 我想使用MySQL中的循环。试过这样的方法: CREAT

我有一个“Port”INT列,它应该在30000到50000之间

所以,我有一个插入值的存储过程(端口不为NULL)。因此,我必须选择“手动”存储在该字段上的值。问题是,尽管我可以在某个点增量插入(30003000130002…)一些条目被删除(它变成30000、30002、30004…),所以需要设置孔

我需要在SP中放置一种适合这些孔的方法(在我的示例中,它们是30000130003…)。我的问题是如何在SP内检查某个值是否已“应用”

我想使用MySQL中的循环。试过这样的方法:

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: