繁体   English   中英

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

[英]Enforcing uniqueness on PostgreSQL table column after non-unique values already inserted

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

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

您要查找的查询是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM