在插入非唯一值后,在PostgreSQL表列上强制实现唯一性

时间:2010-07-21 04:52:46

标签: sql postgresql unique duplicates

我已经有8000万条记录插入到表中,但需要确保一些列是共同唯一的。但是,列已包含非唯一数据,因此ALTER TABLE不起作用。

我想要一个能让我轻松删除非唯一记录的查询,同时保留其中一个记录,或者允许我将当前表中的数据加载到新表中的记录,同时过滤为了独特。

1 个答案:

答案 0 :(得分:5)

您正在寻找的查询是:

select distinct on (my_unique_1, my_unique_2) * from my_table;

这为distinct on中的每个列组合选择一行。实际上,它总是第一个行。它很少在没有order by的情况下使用,因为没有可靠的顺序返回行(因此是第一个)。

结合order by,您可以选择第一行(这会留下具有最​​大last_update_date的行):

 select distinct on (my_unique_1, my_unique_2) * 
 from my_table order by my_unique_1, my_unique_2, last_update_date desc;

现在您可以将其选择为新表:

 create table my_new_table as
 select distinct on (my_unique_1, my_unique_2) * 
 from my_table order by my_unique_1, my_unique_2, last_update_date desc;

或者您可以将其用于删除,假设row_id是主键:

 delete from my_table where row_id not in (
     select distinct on (my_unique_1, my_unique_2) row_id 
     from my_table order by my_unique_1, my_unique_2, last_update_date desc);