sql >> Database teknologi >  >> RDS >> PostgreSQL

Fjern dubletter fra en tabel, og link referencerækker igen til den nye master

Denne enkelte kommando burde gøre det hele:

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;

På grund af mangel på definition valgte jeg rækken med det mindste ID pr. gruppe som overlevende masterrække.

FK-begrænsninger kommer ikke i vejen, medmindre du har ikke-standardindstillinger. Detaljeret forklaring:

Efter at have fjernet duperne vil du måske nu tilføje en UNIQUE begrænsning for at forhindre, at den samme fejl opstår igen:

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


  1. Optimer PostgreSQL skrivebeskyttede tabeller

  2. Kald en API fra SQL Server lagret procedure

  3. Hvordan IFNULL() virker i MariaDB

  4. Indsættelse af analytiske data fra Spark til Postgres