Cette seule commande devrait tout faire :
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;
Par manque de définition, j'ai choisi la ligne avec le plus petit ID par groupe comme ligne principale survivante.
Les contraintes FK ne gênent pas à moins que vous n'ayez des paramètres autres que ceux par défaut. Explication détaillée :
- Comment supprimer les lignes en double avec des dépendances de clés étrangères ?
- Supprimer les doublons et rediriger les lignes de référence vers le nouveau maître
Après avoir supprimé les doublons, vous pouvez maintenant ajouter un UNIQUE
contrainte pour éviter que la même erreur ne se reproduise :
ALTER TABLE transcription
ADD CONSTRAINT transcription_uni UNIQUE (text, citation);