You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何找出数据库中所有缺失的主键?现有查询仅能获取首个缺失ID

获取所有缺失主键ID及范围的SQL方案

原查询只能返回第一个缺失的主键ID,要获取所有缺失项,这里提供两种实用方案:

一、列出所有单个缺失的ID

适合主键范围较小的场景,通过生成连续ID序列对比原表找出缺失值:

WITH all_ids AS (
    SELECT MIN(ogc_fid) AS start_id, MAX(ogc_fid) AS end_id FROM 你的表名
    UNION ALL
    SELECT start_id + 1, end_id FROM all_ids WHERE start_id + 1 <= end_id
)
SELECT a.start_id AS missing_id
FROM all_ids a
LEFT JOIN 你的表名 b ON a.start_id = b.ogc_fid
WHERE b.ogc_fid IS NULL
ORDER BY a.start_id;

把代码里的你的表名替换成实际表名即可。原理是先递归生成主键最小到最大值之间的所有连续ID,再通过左连接筛选出不在原表中的ID。

二、按连续范围显示缺失的ID(如200-500)

适合数据量大的场景,能把连续缺失的ID合并成范围,更直观高效:

WITH gaps AS (
    SELECT 
        ogc_fid + 1 AS gap_start,
        LEAD(ogc_fid) OVER (ORDER BY ogc_fid) - 1 AS gap_end
    FROM 你的表名
    UNION ALL
    -- 可选:如果需要显示最大ID之后的缺失,保留这行;不需要则删除
    SELECT MAX(ogc_fid) + 1, NULL FROM 你的表名
),
valid_gaps AS (
    SELECT gap_start, gap_end
    FROM gaps
    WHERE gap_start <= gap_end OR gap_end IS NULL
)
SELECT 
    CASE 
        WHEN gap_start = gap_end THEN CAST(gap_start AS VARCHAR)
        WHEN gap_end IS NULL THEN CAST(gap_start AS VARCHAR) + ' 及以上'
        ELSE CAST(gap_start AS VARCHAR) + ' - ' + CAST(gap_end AS VARCHAR)
    END AS missing_range
FROM valid_gaps
WHERE gap_start IS NOT NULL
ORDER BY gap_start;

原理是用LEAD窗口函数获取下一个主键值,计算当前主键后的缺失区间;再过滤无效区间,最后把连续缺失格式化成易读的范围。

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:52:17