首页 游戏 软件 资讯 排行榜 专题
首页
数据库
PostgreSQL删除重复数据保留一条的CTID方法详解

PostgreSQL删除重复数据保留一条的CTID方法详解

热心网友
51
转载
2026-05-08

在数据维护中,遇到重复记录需要清理是常事。直接用 ctid 配合子查询删除,思路直接,但必须清楚它的适用边界:这只适合一次性清理、无并发写入、且不依赖物理位置稳定性的场景。否则,很容易踩坑,导致误删或漏删。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

PostgreSQL中如何高效删除重复数据并保留一条_利用CTID和SQL子查询

为什么 ctid 能用来去重?

ctid 是 PostgreSQL 为每行记录分配的一个物理位置标识,由块号和偏移量组成。只要没有执行 VACUUM FULL 或表重建,同一行的这个标识就是不变的。它天生唯一,而且比逻辑主键更“底层”,即使表没有定义主键也能用它来定位。

不过,ctid 终究不是逻辑唯一键。当一行数据被更新后,可能会产生一个新的 ctid,而旧版本可能还留在磁盘上等待清理。此外,VACUUM 操作也可能导致 ctid 重新排列。因此,它只适用于“基于当前数据快照进行临时去重”的场景。

  • 适合场景:导入脏数据后的清洗、测试库的快速去重、无主键的小表处理。
  • 不适合场景:生产环境中频繁更新的表、涉及逻辑复制或订阅的表、需要根据业务时间保留“最新”记录的情况(因为 ctid 小并不绝对代表插入时间早或数据新)。

DELETE ... WHERE ctid NOT IN (SELECT MIN(ctid) ...) 的潜在问题

这个写法看起来简洁明了,但在实际执行时,有几个细节容易出问题:

  • NULL 值陷阱:当 NOT IN 子句中的子查询结果包含 NULL 时,整个条件会返回空集,导致一条记录都删不掉。如果分组字段允许为 NULL,虽然 GROUP BYMIN(ctid) 仍能正常计算,但如果在子查询中误加了类似 WHERE col IS NOT NULL 的条件,就可能意外引入 NULL 风险。
  • 分组字段必须精确匹配:子查询中 GROUP BY 的字段,必须与判定重复的字段完全一致。少一个字段,分组粒度变粗,可能保留了重复项;多一个字段,分组粒度变细,可能把不该去重的行也拆开了。
  • 大表性能压力:对于大表,执行 SELECT MIN(ctid) FROM t GROUP BY a,b 会触发全表扫描和哈希分组,对内存消耗较大。如果相关字段上没有索引,查询速度会非常慢。

一个相对稳妥的写法示例如下(假设对 users 表按 email 字段去重):

DELETE FROM users
WHERE ctid NOT IN (
  SELECT MIN(ctid)
  FROM users
  WHERE email IS NOT NULL  -- 显式排除 NULL,避免 NOT IN 失效
  GROUP BY email
);

想保留“最新插入”或“最新修改”的那条?别只依赖 ctid

通常认为 ctid 值小代表插入时间早,但这个规律并不绝对。批量数据导入(COPY)、事务回滚、或者堆内元组(HOT)更新等技术,都可能导致新插入的行获得更小的 ctid。因此,若想真正保留业务上“最新”的记录,必须依赖明确的时间字段,例如 created_atupdated_at

这时,窗口函数是比单纯依赖 ctid 更可靠的选择:

WITH ranked AS (
  SELECT id, ctid,
         ROW_NUMBER() OVER (
           PARTITION BY email
           ORDER BY updated_at DESC, id DESC
         ) AS rn
  FROM users
  WHERE email IS NOT NULL
)
DELETE FROM users
WHERE ctid IN (SELECT ctid FROM ranked WHERE rn > 1);
  • 这个思路是用 ctid 作为最终的删除锚点,但决定保留哪一行的排序依据是明确的业务时间字段(updated_at),兼顾了语义准确性和执行效率。
  • ORDER BY 子句中加入 id DESC 是为了在时间戳相同的情况下,提供一个确定性的排序规则,避免因执行计划不同而导致结果不一致。
  • 务必在 emailupdated_at 字段上建立复合索引,否则窗口函数的计算(OVER)在大数据量下会非常缓慢。

说到底,真正的难点往往不在于语法本身,而在于如何精确地定义“重复”。是否需要考虑所有 NULL 值的组合?是否要忽略大小写或首尾空格?这些业务逻辑一旦需要融入 GROUP BYPARTITION BY 中,就很难再通过 ctid 这类物理标识来补救。事先明确规则,远比事后补救要高效得多。

来源:https://www.php.cn/faq/2439706.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

戴尔笔记本电脑连接手机热点的两种方法
电脑教程
戴尔笔记本电脑连接手机热点的两种方法

戴尔笔记本连接手机热点:一篇讲透的实战指南 想把手机流量变成戴尔笔记本的无线网络?这事儿其实比想象中更简单。核心流程不外乎两步:先在手机上打开热点并做好设置,然后在笔记本的Wi-Fi列表里找到它、输入密码。整个过程,依赖的是笔记本内置的无线网卡和通用的Wi-Fi协议,完全无需额外配件。无论是安卓还是

热心网友
05.08
三星显示器连接笔记本步骤详解
电脑教程
三星显示器连接笔记本步骤详解

三星显示器连接笔记本电脑,最主流且稳定的方式 想让三星显示器为你的笔记本“添屏加彩”?最主流、也最稳定的方式,还是通过HDMI或USB-C线缆直连,再辅以系统快捷键(比如常见的Fn+F4)快速切换显示模式。好消息是,如今主流的三星显示器普遍配备了HDMI 2 0甚至全功能的USB-C接口,不仅支持最

热心网友
05.08
史密斯热水器如何自行清洁水垢详细操作指南
电脑教程
史密斯热水器如何自行清洁水垢详细操作指南

史密斯热水器清理污垢:一份用户友好的深度清洁指南 给家里的史密斯热水器做一次深度清洁、清一清内胆水垢,这事儿听起来挺专业,但真上手了你会发现,普通用户完全能自己搞定。当然,前提是得把安全规范刻在脑子里。根据品牌官方的售后指南,再结合不少资深维修技师的实操反馈,整套流程其实相当清晰:从断电断水开始,到

热心网友
05.08
红米Note全面屏手机如何设置返回键方法
电脑教程
红米Note全面屏手机如何设置返回键方法

红米Note的返回键,到底去哪儿了? 关于红米Note系列全面屏机型的返回键,一个常见的误解是它被“砍掉”了。其实并非如此。这不是硬件上的物理缺失,而是一个由系统导航方式决定的显示选项——只要在设置里切换到“经典导航键”模式,你熟悉的那个虚拟三键布局,立马就能回来。这个设计的初衷,是源于MIUI H

热心网友
05.08
vivo手机拍月亮模糊的解决办法与原因分析
电脑教程
vivo手机拍月亮模糊的解决办法与原因分析

告别模糊,拍出清晰的月亮:一份vivo手机拍月实操指南 用vivo手机拍月亮,结果总是一片模糊或白茫茫?这问题挺常见,但根子不在手机硬件不行,而在于我们用的“姿势”没对上月球的“脾气”。月亮距离远、亮度高、背景暗,普通拍照模式那套自动逻辑,在这种极端场景下就容易“懵圈”——对焦找不到目标,曝光控不住

热心网友
05.08

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

Cronos CRO官网用途详解 市值排名查询与新手投资注意事项
web3.0
Cronos CRO官网用途详解 市值排名查询与新手投资注意事项

Cronos是一条与Crypto com生态紧密关联的EVM兼容链,其原生代币为CRO。本文介绍了Cronos链的核心定位与官网主要功能,包括作为生态入口、区块浏览器和开发者资源中心。同时分析了CRO代币的市值排名影响因素,如生态发展、市场周期和交易所支持。最后为新手提供了关键注意事项,包括区分Cronos链与Crypto com交易所、妥善管理私钥、警惕诈

热心网友
05.08
戴尔笔记本电脑连接手机热点的两种方法
电脑教程
戴尔笔记本电脑连接手机热点的两种方法

戴尔笔记本连接手机热点:一篇讲透的实战指南 想把手机流量变成戴尔笔记本的无线网络?这事儿其实比想象中更简单。核心流程不外乎两步:先在手机上打开热点并做好设置,然后在笔记本的Wi-Fi列表里找到它、输入密码。整个过程,依赖的是笔记本内置的无线网卡和通用的Wi-Fi协议,完全无需额外配件。无论是安卓还是

热心网友
05.08
三星显示器连接笔记本步骤详解
电脑教程
三星显示器连接笔记本步骤详解

三星显示器连接笔记本电脑,最主流且稳定的方式 想让三星显示器为你的笔记本“添屏加彩”?最主流、也最稳定的方式,还是通过HDMI或USB-C线缆直连,再辅以系统快捷键(比如常见的Fn+F4)快速切换显示模式。好消息是,如今主流的三星显示器普遍配备了HDMI 2 0甚至全功能的USB-C接口,不仅支持最

热心网友
05.08
Polkadot DOT购买指南 安全买入流程与挂单卖出策略
web3.0
Polkadot DOT购买指南 安全买入流程与挂单卖出策略

购买DOT需选择可靠交易平台并完成注册认证。买入时可通过限价单在目标价位挂单,或使用市价单即时成交。卖出时建议分批操作,设置阶梯止盈止损单以管理风险。整个过程需注意资产安全,妥善保管私钥,并关注市场动态做出理性决策。

热心网友
05.08
史密斯热水器如何自行清洁水垢详细操作指南
电脑教程
史密斯热水器如何自行清洁水垢详细操作指南

史密斯热水器清理污垢:一份用户友好的深度清洁指南 给家里的史密斯热水器做一次深度清洁、清一清内胆水垢,这事儿听起来挺专业,但真上手了你会发现,普通用户完全能自己搞定。当然,前提是得把安全规范刻在脑子里。根据品牌官方的售后指南,再结合不少资深维修技师的实操反馈,整套流程其实相当清晰:从断电断水开始,到

热心网友
05.08