如何删除postgresql表中的重复条目?

时间:2015-02-27 10:49:14

标签: sql postgresql

我有一个没有主键的postgresql表。 我想删除所有具有相同ID的条目,但保留最新的条目。

以下陈述几乎可行:

DELETE FROM mytable USING mytable t
  WHERE mytable.id = t.id AND mytable.modification < t.modification;

问题:当两个条目具有相同的修改时间戳(可能)时,两者都会被保留。 我需要改变什么来保留其中一个,哪个不重要?

我无法将条件更改为AND mytable.modification <= t.modification;,因为这会删除所有不保留任何条目的公众。

2 个答案:

答案 0 :(得分:2)

如果您有完全重复的行(即,无法区分彼此),那么您有两个选项。一种是使用内置行标识符,例如ctid

DELETE FROM mytable USING mytable t
  WHERE mytable.id = t.id AND
        (mytable.modification < t.modification OR
         mytable.modification = t.modification AND mytable.ctid < t.ctid);

或使用辅助表:

create table tokeep as
    select distinct on (t.id) t.*
    from mytable
    order by t.id, t.modification;

truncate table mytable;

insert into mytable
    select * from tokeep;

答案 1 :(得分:0)

使用EXISTS查看是否有其他行具有相同的ID:

DELETE FROM mytable t
WHERE EXISTS (SELECT 1 from mytable
              WHERE id = t.id AND modification > t.modification);