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

PostgreSQL删除操作返回行数异常,请求技术排查

问题分析与解答

你的删除操作没有问题——最后一条查询结果为0,说明所有原本匹配test_table.contact_id的contacts记录都已被成功删除。行数显示不一致的原因,主要有以下几种可能:

1. test_table中存在大量重复的contact_id

第一条查询的count(*)统计的是**contacts中id存在于test_table.contact_id的记录总数**(in子查询会自动去重,仅判断id是否存在,不会因test_table的重复值重复统计contacts记录)。但如果test_table里同一个contact_id重复出现多次,执行delete using时,一条contacts记录会被多次匹配,但数据库仅会执行一次删除操作。你可以通过以下语句验证test_table的重复情况:

-- 统计test_table中唯一的contact_id数量
select count(distinct contact_id) from test_table;

如果这个结果接近168408,说明test_table的重复值是核心原因。

2. 第一条count(*)返回了近似值

部分数据库(如PostgreSQL)在处理大表的count(*)时,会依赖过时的统计信息返回近似计数,而非精确值。尤其是当表数据量极大、近期有大量数据变更时,这种误差会很明显。

你可以用以下语句获取精确计数:

-- 用关联查询替代in,避免统计误差
select count(distinct contacts.id)
from contacts
inner join test_table on contacts.id = test_table.contact_id;

如果这个结果和delete返回的168408一致,说明最初的count(*)是近似值。

3. 并发事务的干扰

如果在你执行第一条查询和delete语句的间隙,有其他事务删除了部分contacts记录,会导致delete实际删除的行数减少。但最后查询结果为0,说明所有匹配记录都已被清理,这种情况仅在并发操作恰好处理了剩余记录时才会发生,概率较低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:02:05