PostgreSQL 方法:
DELETE FROM tbl_case_model
WHERE id NOT IN (SELECT MIN(id) -- 保留id最小的記錄FROM tbl_case_modelGROUP BYcolumn1, -- 替換為實際重復列名column2, -- 繼續添加重復列... -- [所有需要比較的列]
);
因為我這次遇到的情況比較特殊,是表中所有數據都一模一樣,那么使用MIN(id)或MAX(id)的方法確實不可行,因為無法區分重復行。
因此,我們可以這樣操作:
- 使用ctid來保留每組重復數據中的一行(例如每組保留最小的ctid)。
- 刪除其他重復行。
-- 使用 ctid(系統隱藏列)作為唯一行標識
DELETE FROM tbl_case_model
WHERE ctid NOT IN (SELECT MIN(ctid) -- 保留每組重復數據中的第一行FROM tbl_case_modelGROUP BY (tbl_case_model.*) -- 按整行分組
);
ctid:PostgreSQL 的內部隱藏列,表示行的物理位置(類似行地址),絕對唯一
GROUP BY (tbl_case_model.*):按整行所有列分組(這是處理全列重復的關鍵)
MIN(ctid):保留每組重復數據中物理位置最小的行