想删除表中重复数据,只留下一条,sql怎么写

PostgreSQL 方法:

java 复制代码
DELETE FROM tbl_case_model
WHERE id NOT IN (
    SELECT MIN(id)  -- 保留id最小的记录
    FROM tbl_case_model
    GROUP BY
        column1,   -- 替换为实际重复列名
        column2,   -- 继续添加重复列
        ...        -- [所有需要比较的列]
);

因为我这次遇到的情况比较特殊,是表中所有数据都一模一样,那么使用MIN(id)或MAX(id)的方法确实不可行,因为无法区分重复行。

因此,我们可以这样操作:

  1. 使用ctid来保留每组重复数据中的一行(例如每组保留最小的ctid)。
  2. 删除其他重复行。
sql 复制代码
-- 使用 ctid(系统隐藏列)作为唯一行标识
DELETE FROM tbl_case_model
WHERE ctid NOT IN (
    SELECT MIN(ctid)  -- 保留每组重复数据中的第一行
    FROM tbl_case_model
    GROUP BY (tbl_case_model.*)  -- 按整行分组
);

ctid:PostgreSQL 的内部隐藏列,表示行的物理位置(类似行地址),绝对唯一

GROUP BY (tbl_case_model.*):按整行所有列分组(这是处理全列重复的关键)

MIN(ctid):保留每组重复数据中物理位置最小的行

相关推荐
程序猿小D3 小时前
[附源码+数据库+毕业论文+开题报告]基于Spring+MyBatis+MySQL+Maven+jsp实现的车辆运输管理系统,推荐!
java·数据库·mysql·spring·毕业设计·开题报告·车辆运输管理系统
极限实验室5 小时前
ES 踩坑记:Set Processor 字段更新引发的 _source 污染
数据库
regret~6 小时前
【记录】Ubuntu20.04安装mysql
数据库·mysql
哆啦A梦的口袋呀9 小时前
pymongo库:简易方式存取数据
数据库·mongodb
城里有一颗星星9 小时前
6.删除-demo
数据库·go
失重外太空啦9 小时前
Mysql练习
android·数据库·mysql
像风一样自由20209 小时前
Navicat操作指南:MySQL数据库配置与Todo应用部署
数据库·mysql·adb
青竹易寒10 小时前
Redis技术笔记-从三大缓存问题到高可用集群落地实战
数据库·redis·笔记