Zihao88 发表于 2021-3-24 17:06

MySQL查询丢失的id

如题,一张数据表中的id是自增的,但由于某些原因丢失了很多id,现需要查询已丢失的id。
在网上搜到这样一句命令:
select id+1 as id from table a where not exists(select * from table b where b.id = a.id + 1) and id < (select MAX(id) from table)
例:数据表id为:1,3,4,5,9,11
使用上述命令查询出来的结果为2,6,10,而非本题所需的2,6,7,8,10。
那么如何优化上述代码或查询得到本题结果呢?

傻紫傻 发表于 2021-3-24 18:20

本帖最后由 傻紫傻 于 2021-3-24 18:28 编辑

DROP PROCEDURE IF EXISTS FindMissID;

DELIMITER \\

CREATE PROCEDURE FindMissID()
BEGIN
DECLARE num INT DEFAULT 0; -- 循环次数
DECLARE nowID INT DEFAULT 0; -- 当前ID
DECLARE Done BOOLEAN DEFAULT FALSE;
DECLARE csr CURSOR FOR SELECT id FROM temp;
-- 若遍历结束则将Done置为TRUE
DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done = TRUE;

OPEN csr;
Label : LOOP
    -- 获取当前ID
    FETCH csr INTO nowID;
    IF Done THEN
      LEAVE Label;
    END IF;
    SET num = num + 1;

    -- 当前ID与循环次数不等则中间缺失ID
    IF nowID != num THEN
      SELECT num as STARTID, nowID - 1 as ENDID;
      -- 同步循环次数与当前ID
      SET num = nowID;
    END IF;

    END LOOP Label;
    CLOSE csr;
END\\

DELIMITER ;

CALL FindMissID();

DROP PROCEDURE IF EXISTS FindMissID;

Zihao88 发表于 2021-3-24 19:00

傻紫傻 发表于 2021-3-24 18:20
DROP PROCEDURE IF EXISTS FindMissID;

DELIMITER \\


这是什么。。。{:1_904:}

傻紫傻 发表于 2021-3-24 23:19

Zihao88 发表于 2021-3-24 19:00
这是什么。。。

mysql的存储过程

Takitooru 发表于 2021-3-25 08:50

https://blog.csdn.net/chenlu5201314/article/details/105150064/
根据上面的链接,修改一下换你的数据表大概能用了,一共三种方法。
页: [1]
查看完整版本: MySQL查询丢失的id