sql >> Database >  >> RDS >> PostgreSQL

Verwijder duplicaten uit een tabel en koppel de referentierijen opnieuw aan de nieuwe master

Deze enkele opdracht zou het allemaal moeten doen:

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;

Bij gebrek aan definitie koos ik de rij met de kleinste ID per groep als overgebleven hoofdrij.

FK-beperkingen staan ​​niet in de weg, tenzij u niet-standaardinstellingen heeft. Gedetailleerde uitleg:

Nadat je de dupes hebt verwijderd, wil je nu misschien een UNIQUE . toevoegen beperking om te voorkomen dat dezelfde fout zich opnieuw voordoet:

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


  1. Versnelt het gebruik van LIMIT 1 een zoekopdracht op een primaire sleutel?

  2. OCCI-app crasht bij gebruik in foutopsporingsmodus in Visual Studio 2005

  3. elk woord zoeken met LIKE %

  4. Facebook-achtige meldingen volgen (DB Design)