Detta enda kommando borde göra allt:
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;
I brist på definition valde jag raden med minsta ID per grupp som överlevande huvudrad.
FK-begränsningar kommer inte i vägen om du inte har inställningar som inte är standard. Detaljerad förklaring:
- Hur tar man bort dubbletter av rader med främmande nycklar?
- Ta bort dubbletter och dirigera om referensrader till ny master
Efter att ha tagit bort duperna kanske du nu vill lägga till en UNIQUE
begränsning för att förhindra att samma fel uppstår igen:
ALTER TABLE transcription
ADD CONSTRAINT transcription_uni UNIQUE (text, citation);