Dieser einzelne Befehl sollte alles erledigen:
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;
Mangels Definition habe ich die Zeile mit der kleinsten ID pro Gruppe als überlebende Masterzeile gewählt.
FK-Einschränkungen stören nicht, es sei denn, Sie haben nicht standardmäßige Einstellungen. Ausführliche Erklärung:
- Wie entferne ich doppelte Zeilen mit Fremdschlüsselabhängigkeiten?
- Löschen Sie Duplikate und leiten Sie referenzierende Zeilen an den neuen Master um
Nachdem Sie die Dupes entfernt haben, möchten Sie vielleicht jetzt einen UNIQUE
hinzufügen Einschränkung, um zu verhindern, dass derselbe Fehler erneut auftritt:
ALTER TABLE transcription
ADD CONSTRAINT transcription_uni UNIQUE (text, citation);