PostgreSQL主键查询返回空值异常求助:ID存在却查不到
脏数据或主键序列异常
自增主键虽默认不会重复,但如果存在手动插入ID、主键自增序列被人为修改跳过27820的情况,会导致seeds_tag关联的ID是无效的“幽灵数据”。先执行SELECT id, seeds_tag FROM 用户表 WHERE seeds_tag = '你的查询标签值';确认返回的ID确实是27820,再执行SELECT COUNT(*) FROM 用户表 WHERE id = 27820;验证是否真的无对应数据。如果前者有结果后者无,说明这条seeds_tag记录关联了不存在的ID,大概率是插入时事务未提交、或删除ID后未同步更新关联记录导致的脏数据。Beaver工具的过滤规则差异
检查Beaver是否默认带了隐藏过滤条件,比如自动排除逻辑删除(如is_deleted = 1)的记录,或者只显示特定状态的数据。很多数据库工具会在可视化查询时自动添加这类过滤,但直接写SQL查询时不会继承。可以在Beaver中查看执行seeds_tag查询时的原生SQL(多数工具会显示执行的真实语句),和你手动写的ID查询SQL做对比,看是否存在过滤条件差异。数据类型隐式转换问题
尽管ID是bigint类型,但如果查询时把ID以字符串形式传入(比如WHERE id = '27820'),部分数据库在隐式转换时可能出现匹配异常,尤其是字符集或排序规则不一致的情况。尝试用纯数字条件WHERE id = 27820重新查询,同时确认BETWEEN 27817 AND 27822是数字范围而非字符串范围。分表分库路由错误
如果用户表采用了分表分库架构,seeds_tag查询的路由规则和ID查询的路由规则可能不一致。比如分表键是seeds_tag相关字段,seeds_tag查询能命中正确分表,但ID查询时路由规则错误,导致查错了分表。可以核对分表策略,确认ID27820所属的分表,直接去对应分表执行查询验证。事务或缓存导致的不一致
如果查询seeds_tag的操作处于未提交事务中,而ID查询在另一个事务,可能出现不可重复读的情况;或者数据库查询缓存未更新,返回了旧数据。尝试提交所有未完成的事务,或清空查询缓存后重新执行ID查询。
内容的提问来源于stack exchange,提问作者David_Try_Everything

