PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Hapus duplikat dari tabel dan tautkan kembali baris referensi ke master baru

Perintah tunggal ini harus melakukan semuanya:

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;

Karena kurangnya definisi, saya memilih baris dengan ID terkecil per grup sebagai baris master yang bertahan.

Kendala FK tidak menghalangi kecuali Anda memiliki pengaturan non-default. Penjelasan detail:

Setelah menghapus penipuan, sekarang Anda mungkin ingin menambahkan UNIQUE kendala untuk mencegah kesalahan yang sama terulang kembali:

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. Buat database menggunakan fungsi tersimpan

  2. Mengembalikan beberapa nilai dalam suatu fungsi

  3. cap waktu postgresql ke nilai std::chrono

  4. Cara Mengelompokkan berdasarkan Bulan di PostgreSQL

  5. Bagaimana saya bisa mempercepat perbedaan antar tabel?