इस एकल आदेश को यह सब करना चाहिए:
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);