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)的方法确实不可行,因为无法区分重复行。
因此,我们可以这样操作:
- 使用ctid来保留每组重复数据中的一行(例如每组保留最小的ctid)。
- 删除其他重复行。
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):保留每组重复数据中物理位置最小的行