2009-03-13 24 views
77

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

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

उत्तर

142

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

जहाँ तक खोजने के रूप में मौजूदा डुप्लिकेट इस प्रयास करें:

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

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

+1

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

+1

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

4

डुप्लिकेट ढूंढने के लिए:

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

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

+1

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

3

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

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

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

ALTER TABLE table 
    ADD UNIQUE(stone_id, charge_title) 

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

+0

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

0

इस अतः पद मुझे मदद मिली है, लेकिन मैं भी हटा सकते हैं और पंक्तियों में से एक रखने के लिए कैसे जानना चाहता था ... डुप्लीकेट पंक्तियों को हटाने और एक रखने के लिए एक 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

'वैकल्पिक IGNORE तालिका तालिका अद्वितीय इंडेक्स index_name (stone_id, charg_title) जोड़ें, डुप्लिकेट पंक्तियों को केवल एक अद्वितीय जोड़ी छोड़कर हटा देगा। –

26

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

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

यह प्रभावी रूप से अद्वितीय जिसका अर्थ है आप डुप्लिकेट रिकॉर्ड है कभी नहीं होगा बाधा कहते हैं और ध्यान न दें मौजूदा डुप्लिकेट हटा देता है।http://mediakey.dk/~cc/mysql-remove-duplicate-entries/

अपडेट::

आप और अधिक के बारे में हाँ ALTER यहाँ ध्यान न दें पढ़ सकते हैं मैं @Inquisitive द्वारा बताया गया कि इस MySql के संस्करणों> 5.5 में विफल हो सकता है:

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

+0

+1 केवल 3 साल देर से ... लेकिन अभी भी उपयोगी जानकारी। धन्यवाद। –

+1

सच है, लेकिन कम से कम अगली बार आप जानते हैं। मेरे पास एक ही समस्या थी और सोचा कि – SeanDowney

+0

दूसरों के साथ साझा करना अच्छा था, मैं केवल 3 साल के अंत में चिढ़ा रहा था। वास्तव में आप खुश हैं कि आपने साझा किया। इसलिए प्लस 1. –

संबंधित मुद्दे