首页 文章

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

提问于
浏览
0

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

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

1 回答

  • 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);
    

相关问题