PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Премахнете дубликати от таблица и свържете отново препращащите редове към новия главен

Тази единствена команда трябва да направи всичко:

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);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. `pg_tblspc` липсва след инсталиране на най-новата версия на OS X (Yosemite или El Capitan)

  2. Предоставяне на системно разрешение на postgres windows за копиране (windows 8)

  3. Как да конвертирате полигонални данни в линейни сегменти с помощта на PostGIS

  4. PostgreSQL в Docker - pg_hba.conf за разрешаване на достъп от хост до контейнер

  5. Използване на курсори за страници в PostgreSQL