PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Xóa các bản sao khỏi bảng và liên kết lại các hàng tham chiếu với trang cái mới

Lệnh đơn này sẽ thực hiện tất cả:

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;

Vì thiếu định nghĩa, tôi đã chọn hàng có ID nhỏ nhất cho mỗi nhóm làm hàng chính còn tồn tại.

Các ràng buộc FK không cản trở trừ khi bạn có cài đặt không mặc định. Giải thích chi tiết:

Sau khi loại bỏ phần lừa đảo, bây giờ bạn có thể muốn thêm một UNIQUE ràng buộc để ngăn lỗi tương tự tái xuất hiện:

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. Làm thế nào để phân biệt tên biến plpgsql trong mệnh đề BẬT MÂU THUẪN?

  2. Các giao dịch lồng nhau trong postgresql 8.2?

  3. Elegant PostgreSQL Group của Ruby on Rails / ActiveRecord

  4. 2ndQuadrant tại PostgresConf US 2018

  5. Cách lưu trữ DateTimeOffset trong PostreSQL