PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Supprimer les doublons d'une table et relier à nouveau les lignes de référence au nouveau maître

Cette seule commande devrait tout faire :

WITH blacklist AS (  -- identify duplicate IDs and their master
   SELECT *
   FROM  (
      SELECT transcription_id
           , min(transcription_id) OVER (PARTITION BY text, citation) AS master_id
      FROM   transcription
      ) sub
   WHERE  transcription_id <> master_id
   )
, upd AS (  -- redirect referencing rows
   UPDATE town_transcription tt
   SET    transcription_id = b.master_id
   FROM   blacklist b
   WHERE  b.transcription_id = tt.transcription_id
   )
DELETE FROM transcription t  -- kill dupes (now without reference)
USING  blacklist b
WHERE  b.transcription_id = t.transcription_id;

Par manque de définition, j'ai choisi la ligne avec le plus petit ID par groupe comme ligne principale survivante.

Les contraintes FK ne gênent pas à moins que vous n'ayez des paramètres autres que ceux par défaut. Explication détaillée :

Après avoir supprimé les doublons, vous pouvez maintenant ajouter un UNIQUE contrainte pour éviter que la même erreur ne se reproduise :

ALTER TABLE transcription
ADD CONSTRAINT transcription_uni UNIQUE (text, citation);