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

ehs*_*nul 0 sql postgresql unique duplicates

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

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

Kon*_*rus 5

您正在寻找的查询是:

select distinct on (my_unique_1, my_unique_2) * from my_table;
Run Code Online (Sandbox Code Playgroud)

这为每个列组合选择一行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;
Run Code Online (Sandbox Code Playgroud)

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

 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;
Run Code Online (Sandbox Code Playgroud)

或者您可以将其用于删除,假设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);
Run Code Online (Sandbox Code Playgroud)