sql >> Databáze >  >> RDS >> PostgreSQL

Odstraňte duplikáty z tabulky a znovu propojte odkazující řádky s novou předlohou

Tento jediný příkaz by měl udělat vše:

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;

Pro nedostatek definice jsem zvolil řádek s nejmenším ID na skupinu jako přežívající hlavní řádek.

Omezení FK nepřekáží, pokud nemáte jiné než výchozí nastavení. Podrobné vysvětlení:

Po odstranění dupů můžete nyní chtít přidat UNIQUE omezení, které zabrání opakování stejné chyby:

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


  1. Jak implementovat INSERT ON DUPLICATE KEY UPDATE aka upsert v CakePHP 3?

  2. SET extra_float_digits =3 v postgresql

  3. Objekty sady dotazů Django vracejí žádné místo 0, přestože databáze má jako hodnotu pole uloženu 0

  4. Rozpoznávání vzoru řádků v SQL