吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1357|回复: 4
收起左侧

[求助] MySQL查询丢失的id

[复制链接]
Zihao88 发表于 2021-3-24 17:06
如题,一张数据表中的id是自增的,但由于某些原因丢失了很多id,现需要查询已丢失的id。
在网上搜到这样一句命令:
[SQL] 纯文本查看 复制代码
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 23:19
Takitooru 发表于 2021-3-25 08:50
https://blog.csdn.net/chenlu5201314/article/details/105150064/
根据上面的链接,修改一下换你的数据表大概能用了,一共三种方法。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 04:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表