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: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;
傻紫傻 发表于 2021-3-24 18:20
DROP PROCEDURE IF EXISTS FindMissID;
DELIMITER \\
这是什么。。。{:1_904:} Zihao88 发表于 2021-3-24 19:00
这是什么。。。
mysql的存储过程 https://blog.csdn.net/chenlu5201314/article/details/105150064/
根据上面的链接,修改一下换你的数据表大概能用了,一共三种方法。
页:
[1]