我有一个没有主键的postgresql
表。
我想删除所有具有相同ID的条目,但保留最新的条目。
以下陈述几乎可行:
DELETE FROM mytable USING mytable t
WHERE mytable.id = t.id AND mytable.modification < t.modification;
问题:当两个条目具有相同的修改时间戳(可能)时,两者都会被保留。 我需要改变什么来保留其中一个,哪个不重要?
我无法将条件更改为AND mytable.modification <= t.modification;
,因为这会删除所有不保留任何条目的公众。
答案 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);