Тази единствена команда трябва да направи всичко:
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;
Поради липса на определение избрах реда с най-малкия идентификатор на група като оцелял главен ред.
FK ограниченията не пречат, освен ако нямате настройки, които не са по подразбиране. Подробно обяснение:
- Как да премахнете дублиращи се редове със зависимости от външни ключове?
- Изтриване на дубликати и пренасочване на препращащи редове към нов главен
След като премахнете дупките, сега може да искате да добавите UNIQUE
ограничение за предотвратяване на повторна поява на същата грешка:
ALTER TABLE transcription
ADD CONSTRAINT transcription_uni UNIQUE (text, citation);