2 कॉलम 1 में डुप्लिकेट कैसे खोजें


107

मेरे पास दो कॉलम के साथ एक MySQL डेटाबेस टेबल है जो मेरी रुचि है। व्यक्तिगत रूप से वे प्रत्येक डुप्लिकेट हो सकते हैं, लेकिन उन्हें कभी भी समान मूल्य वाले बीओटीएच का डुप्लिकेट नहीं होना चाहिए।

stone_idके रूप में लंबे समय के रूप में प्रत्येक upshargeशीर्षक अलग है, और रिवर्स में डुप्लिकेट हो सकता है । लेकिन उदाहरण के लिए stone_id= 412 और upcharge_title= "नीलम" कहें कि संयोजन केवल एक बार होना चाहिए।

यह ठीक है:

stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "ruby"

यह ठीक नहीं है:

stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "sapphire"

क्या कोई क्वेरी है जो दोनों क्षेत्रों में डुप्लिकेट पाएगी? और यदि संभव हो तो अनुमति नहीं देने के लिए मेरा डेटा-बेस सेट करने का एक तरीका है?

मैं MySQL संस्करण 4.1.22 का उपयोग कर रहा हूं

जवाबों:


192

आपको दो क्षेत्रों के बीच एक संयुक्त कुंजी सेट करनी चाहिए। इसके लिए प्रत्येक पंक्ति के लिए एक अद्वितीय stone_id और upcharge_title की आवश्यकता होगी।

जहां तक ​​मौजूदा डुप्लिकेट का पता लगाने की कोशिश है:

select   stone_id,
         upcharge_title,
         count(*)
from     your_table
group by stone_id,
         upcharge_title
having   count(*) > 1

धन्यवाद, जो उन्हें चुनता है। क्या आप इतने दयालु हो सकते हैं कि मुझे यह बताएं कि डुप्लिकेट कैसे हटाएं (लेकिन 1 कॉपी छोड़ दें) धन्यवाद!
जेडी इसाके

2
एक तरीका यह होगा कि सभी विशिष्ट डेटा को पकड़ा जाए और तालिका को फिर से बनाया जाए।
मियागी कोडर

1
@ जॉन आइज़ैक: यदि कोई अन्य फ़ील्ड नहीं है जिसके साथ आप उन्हें अलग कर सकते हैं (यानी सभी फ़ील्ड डुप्लिकेट हैं), तो आपको दोनों पंक्तियों को हटाना होगा और एक को फिर से बनाना होगा। एक तरीका यह होगा कि डुप्लिकेट को तालिका की एक प्रति में कॉपी करें, उन्हें मूल से हटाएं, और प्रतिलिपि से अलग पंक्तियों को फिर से बनाएँ।
पी डैडी

यह does.१ पोस्टग्रेज पर काम नहीं करता है, क्या कोई मुझे उस पर हाथ दे सकता है?
लेनन

बहुत धन्यवाद, क्या यह आदेश है कि आप मामले से समूह?
एंड्रयू

35

मुझे "ALTER IGNORE" का उपयोग करके एक अनकही इंडेक्स जोड़ने में मदद मिली, जो डुप्लिकेट को हटाता है और अद्वितीय रिकॉर्डों को लागू करता है जो आपको लगता है कि आप करना चाहते हैं। तो सिंटैक्स होगा:

ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);

यह प्रभावी रूप से अद्वितीय बाधा को जोड़ता है जिसका अर्थ है कि आपके पास कभी भी डुप्लिकेट रिकॉर्ड नहीं होंगे और IGNORE मौजूदा डुप्लिकेट को हटा देता है।

आप eh ALTER IGNORE के बारे में और अधिक यहाँ पढ़ सकते हैं: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/

अपडेट: मुझे @Inquisitive द्वारा सूचित किया गया था कि यह MySql> 5.5 के संस्करणों में विफल हो सकता है:

यह MySQL> 5.5 और InnoDB टेबल पर और Percona में उनके InnoDB फास्ट इंडेक्स क्रिएशन फीचर [ http://bugs.mysql.com/bug.php?id=40344] के कारण विफल रहता है । इस स्थिति में पहले चलाएं set session old_alter_table=1और फिर उपरोक्त आदेश ठीक काम करेगा

अद्यतन - ALTER IGNORE5.7 में हटाया गया

से डॉक्स

MySQL 5.6.17 के रूप में, IGNORE क्लॉज को हटा दिया गया है और इसका उपयोग एक चेतावनी उत्पन्न करता है। MySQL 5.7 में IGNORE को हटा दिया गया है।

MySQL देव के दो विकल्पों में से एक :

  • अद्वितीय फ़ील्ड द्वारा समूह और ऊपर दिखाए गए अनुसार हटाएं
  • एक नई तालिका बनाएँ, एक अद्वितीय सूचकांक जोड़ें, उपयोग करें INSERT IGNORE, पूर्व:
CREATE TABLE duplicate_row_table LIKE regular_row_table;
ALTER TABLE duplicate_row_table ADD UNIQUE INDEX (id, another_id);
INSERT IGNORE INTO duplicate_row_table SELECT * FROM regular_row_table;
DROP TABLE regular_row_table;
RENAME TABLE duplicate_row_table TO regular_row_table;

लेकिन आपकी तालिका के आकार के आधार पर, यह व्यावहारिक नहीं हो सकता है


1
सच है, लेकिन कम से कम अगली बार जब आप जानते हैं। मेरे पास एक ही मुद्दा था और दूसरों के साथ साझा करना अच्छा लगा
शॉनडाउन

मैं केवल 3 साल लेट होने के बारे में चिढ़ा रहा था। सच में खुशी है कि आपने साझा किया। इसलिए प्लस 1.
जेडी इसहाक

मुझे लगता है कि यह डुप्लिकेट में से एक को मनमाने ढंग से हटा देता है इसलिए सुनिश्चित करें कि प्रत्येक पंक्ति के बीच अलग-अलग डेटा नहीं है जो जानने या रखने के लिए उपयोगी हो सकता है।
जोशुआ पिंटर

2 साल की देरी के बाद भी जवाब के लिए +1। मैंने गलती से एक समग्र कुंजी हटा दी थी और यह एक जीवन रक्षक था। धन्यवाद
ivcode

मैंने कुछ डुप्लिकेट खोजक तकनीकों की कोशिश की है और उनमें से कोई भी यह सरल और तेज नहीं था। इस विधि को साझा करने के लिए धन्यवाद।
कृत्जन ओ।

8

आप इस तरह डुप्लिकेट पा सकते हैं ..

Select
    stone_id, upcharge_title, count(*)
from 
    particulartable
group by 
    stone_id, upcharge_title
having 
    count(*) > 1

4

डुप्लिकेट खोजने के लिए:

select stone_id, upcharge_title from tablename group by stone_id, upcharge_title having count(*)>1

भविष्य में इससे बचने के लिए विवश करने के लिए, इन दो क्षेत्रों पर एक समग्र अद्वितीय कुंजी बनाएं।


1
बहुत बहुत धन्यवाद, क्या आप कृपया मुझे बता सकते हैं कि कैसे सभी को हटाएं लेकिन एक डुप्लिकेट का। और मैं phpmyadmin में एक कंपोजिट कुंजी कैसे सेट करूं। धन्यवाद!!!
जद इसाक्स

3

संयोग से, मेज पर एक समग्र अद्वितीय बाधा यह पहली जगह में होने से रोकती है।

ALTER TABLE table
    ADD UNIQUE(stone_id, charge_title)

(यह मान्य T-SQL है। MySQL के बारे में निश्चित नहीं है।)


1
मुझे लगता है कि काम करता है, लेकिन यह मुझे तब तक करने नहीं देता जब तक मैं पहले डुप्लिकेट को हटा नहीं देता। धन्यवाद।
जेडी इसाकेस

1

इस SO पोस्ट ने मेरी मदद की, लेकिन मैं यह भी जानना चाहता था कि कैसे पंक्तियों में से एक को हटाना और रखना है ... यहाँ डुप्लिकेट पंक्तियों को हटाने और एक रखने के लिए एक PHP समाधान है (मेरे मामले में केवल 2 कॉलम थे और यह एक में है डुप्लिकेट श्रेणी संघों को साफ़ करने का कार्य)

$dupes = $db->query('select *, count(*) as NUM_DUPES from PRODUCT_CATEGORY_PRODUCT group by fkPRODUCT_CATEGORY_ID, fkPRODUCT_ID having count(*) > 1');
if (!is_array($dupes))
    return true;
foreach ($dupes as $dupe) {
    $db->query('delete from PRODUCT_CATEGORY_PRODUCT where fkPRODUCT_ID = ' . $dupe['fkPRODUCT_ID'] . ' and fkPRODUCT_CATEGORY_ID = ' . $dupe['fkPRODUCT_CATEGORY_ID'] . ' limit ' . ($dupe['NUM_DUPES'] - 1);
}

(सीमा NUM_DUPES - 1) वह है जो एकल पंक्ति को संरक्षित करती है ...

सबको शुक्रीया


3
ALTER IGNORE TABLE table ADD UNIQUE INDEX index_name(stone_id, charge_title)केवल एक अद्वितीय जोड़ी को छोड़कर डुप्लिकेट पंक्तियों को हटा देगा।
देव-नल-निवासी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.