Обеспечение уникальности столбца таблицы PostgreSQL после вставки неуникальных значений - PullRequest
0 голосов
/ 21 июля 2010

У меня уже есть 80 миллионов записей, вставленных в таблицу, но необходимо убедиться, что несколько столбцов совместно уникальны. Однако столбцы уже содержат неуникальные данные, поэтому ALTER TABLE не работает.

Мне нужен либо запрос, который позволит мне легко удалять неуникальные записи, сохраняя при этом одну из них, либо запрос, который позволит мне загрузить данные из текущей таблицы в новую при фильтрации за уникальность.

1 Ответ

5 голосов
/ 21 июля 2010

Запрос, который вы ищете:

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