0 votes

Renforcement de l'unicité d'une colonne de table PostgreSQL après l'insertion de valeurs non uniques

J'ai déjà inséré 80 millions d'enregistrements dans une table, mais je dois m'assurer que quelques colonnes sont uniques en commun. Cependant, les colonnes contiennent déjà des données non uniques, donc ALTER TABLE ne fonctionne pas.

Je voudrais soit une requête qui me permette de supprimer facilement les enregistrements qui ne sont pas uniques, tout en conservant l'un d'entre eux, soit une requête qui me permette de charger les données de la table actuelle dans une nouvelle table, tout en filtrant l'unicité.

5voto

Konrad Garus Points 19280

La requête que vous recherchez est :

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

Cela permet de sélectionner une ligne pour chaque combinaison de colonnes dans la base de données. distinct on . En fait, c'est toujours le premier rang. C'est rarement utilisé sans order by car il n'y a pas d'ordre fiable dans lequel les lignes sont retournées (et donc laquelle est la première).

Combiné avec order by vous pouvez choisir quelles lignes sont les premières (cela laisse les lignes avec la plus grande 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;

Maintenant vous pouvez sélectionner ceci dans une nouvelle table :

 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;

Ou vous pouvez l'utiliser pour supprimer, en supposant que row_id est une clé primaire :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X