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:
- Làm cách nào để xóa các hàng trùng lặp có phụ thuộc khóa ngoại?
- Xóa các bản sao và định tuyến lại các hàng tham chiếu đến trang cái mới
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);