2010-02-08 10 views
30

मेरे पास 3 कॉलम - आईडी (पीके), पेजआईडी (एफके), नाम वाला एक टेबल है। मेरे पास एक php स्क्रिप्ट है जो तालिका में लगभग 5000 रिकॉर्ड डंप करती है, जिसमें लगभग आधे डुप्लिकेट होते हैं, उसी पृष्ठ आईडी और नाम के साथ। पेज आईडी और नाम का संयोजन अद्वितीय होना चाहिए। PHP में डुप्लिकेट को सहेजने से रोकने का सबसे अच्छा तरीका क्या है क्योंकि मैं php में स्क्रिप्ट के माध्यम से लूप करता हूं?mysql डेटाबेस में डुप्लिकेट प्रविष्टि से बचने का सबसे अच्छा तरीका

उत्तर

96

प्रथम चरण की मेज पर एक अद्वितीय कुंजी सेट करने के लिए होगा:

ALTER TABLE thetable ADD UNIQUE INDEX(pageid, name); 

तो फिर तुम क्या आप क्या करना चाहते है जब वहाँ एक डुप्लिकेट है तय करने के लिए किया है। आपको:

  1. इसे अनदेखा करें?

    INSERT IGNORE INTO thetable (pageid, name) VALUES (1, "foo"), (1, "foo"); 
    
  2. पहले दर्ज किए गए रिकॉर्ड को ओवरराइट करें?

    INSERT INTO thetable (pageid, name, somefield) 
    VALUES (1, "foo", "first") 
    ON DUPLICATE KEY UPDATE (somefield = 'first') 
    
    INSERT INTO thetable (pageid, name, somefield) 
    VALUES (1, "foo", "second") 
    ON DUPLICATE KEY UPDATE (somefield = 'second') 
    
  3. कुछ काउंटर अपडेट करें?

    INSERT INTO thetable (pageid, name) 
    VALUES (1, "foo"), (1, "foo") 
    ON DUPLICATE KEY UPDATE (pagecount = pagecount + 1) 
    
+3

बिग धन्यवाद, यह स्टैक ओवरलो पर कुछ समय के लिए शोध किए गए एक प्रश्न का एक उत्कृष्ट उत्तर था। – capfu

1

आप पेजआईडी और नाम को MySQL डेटाबेस में एक अद्वितीय अनुक्रमणिका में सेट कर सकते हैं। इस तरह जब आप पंक्तियों को सम्मिलित करते हैं, तो यह एक त्रुटि उत्पन्न करेगा, जिसे PHP द्वारा अनदेखा किया जा सकता है, और आप केवल अगली पंक्ति पर जा सकते हैं।

यह मानता है कि आप पंक्तियों को व्यक्तिगत रूप से सम्मिलित कर रहे हैं। उर्फ:

foreach($large_data as $fields) 
{ 
    mysql_query("INSERT INTO TABLE (`Something`) VALUES('".$fields['something']."'); 
} 
+1

जानबूझकर जब आप डुप्लीकेट पंक्तियों मारा mysql_query() पीएचपी चेतावनी फेंक करने के लिए अनुमति तरह का गंदा (यह clutters अपनी लॉग, यह अपेक्षाकृत गहन, संसाधन है आदि) है। खासकर जब उन्हें पहली जगह में रोकना अन्य समाधानों में उल्लिखित MySQL की 'INSERT IGNORE' सुविधा का उपयोग करना उतना आसान है। इसके अतिरिक्त, जब लूप सम्मिलित वाक्यविन्यास उपलब्ध होता है तो लूप में डालना अक्षम होता है। –

1

एक mysql बिंदु से आप

alter table YOURTABLE add unique index(pageId, name); 

कर सकते हैं अपने शब्दों सही है और क्या आप

$already_done = array(); 
foreach ($records as $record) 
{ 
    $unique_hash = md5($record['name'].$record['pageId']); 
    if (!in_array($unique_hash, $already_done)) 
    { 
     $already_done[] = $unique_hash; 
     // sql insert here 
    } 
} 

किसी भी तरह से उन चाहिए कर सकते हैं php से करना चाहते हैं क्या तुम ठीक हो

+1

बेशक, अगर स्क्रिप्ट शुरू होने से पहले * पहले से ही रिकॉर्ड्स में रिकॉर्ड्स हैं, तो वे '$ pre_done' में दिखाई नहीं देंगे। –

3

आप mysql के साथ त्रुटि को भी अनदेखा कर सकते हैं: तालिका में INSERT IGNORE ... यह कुंजी त्रुटि को अनदेखा कर देगा, उस डालने पर छोड़ देगा और अगले पर आगे बढ़ेगा।

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

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