Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

कोल्डफ्यूज़न और MySQL का उपयोग करके डेटा को पार्स और तुलना करें

दोनों प्रतिक्रियाओं में संभावनाएं हैं। बस अपने विकल्पों पर थोड़ा विस्तार करने के लिए ..

विकल्प #1

अगर mySQL किसी प्रकार की हैशिंग का समर्थन करता है, प्रति पंक्ति के आधार पर , आप comodoro's सुझाव की विविधता का उपयोग कर सकते हैं हार्ड डिलीट से बचने के लिए।

परिवर्तित पहचानें

परिवर्तनों की पहचान करने के लिए, प्राथमिक कुंजी पर एक आंतरिक जुड़ाव करें और हैश मानों की जांच करें। यदि वे भिन्न हैं, तो उत्पाद बदल दिया गया था और इसे अद्यतन किया जाना चाहिए:

    UPDATE Products p INNER JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.ProductName = tmp.ProductName
           , p.Stock = tmp.Stock
           , ...
           , p.DateLastChanged = now()
           , p.IsDiscontinued  = 0
    WHERE  tmp.TheRowHash <> p.TheRowHash

हटाए गए की पहचान करें

उन रिकॉर्ड्स की पहचान करने के लिए एक साधारण बाहरी जुड़ाव का उपयोग करें जो अस्थायी तालिका में मौजूद नहीं हैं, और उन्हें "हटाए गए" के रूप में चिह्नित करें

    UPDATE Products p LEFT JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.DateLastChanged = now()
           , p.IsDiscontinued = 1
    WHERE  tmp.ProductID IS NULL

नई पहचान करें

अंत में, किसी भी "नए" उत्पादों को सम्मिलित करने के लिए समान बाहरी जुड़ाव का उपयोग करें।

    INSERT INTO Products ( ProductName, Stock, DateLastChanged, IsDiscontinued, .. )
    SELECT tmp.ProductName, tmp.Stock, now() AS DateLastChanged, 0 AS IsDiscontinued, ...
    FROM   Products_Temp tmp LEFT JOIN Products p ON tmp.ProductID = p.ProductID
    WHERE  p.ProductID IS NULL

विकल्प #2

यदि प्रति पंक्ति हैशिंग संभव नहीं है, तो वैकल्पिक दृष्टिकोण Sharondio के सुझाव की भिन्नता है। .

अस्थायी तालिका में "स्थिति" कॉलम जोड़ें और सभी आयातित रिकॉर्ड को "नया", "बदला" या "अपरिवर्तित" के रूप में शामिल होने की एक श्रृंखला के माध्यम से चिह्नित करें। (डिफ़ॉल्ट "बदला हुआ" होना चाहिए)।

संयुक्त राष्ट्र-परिवर्तित की पहचान करें

उन उत्पादों की पहचान करने के लिए, जो नहीं बदले हैं, पहले सभी क्षेत्रों में एक आंतरिक जुड़ाव का उपयोग करें। (ध्यान दें, यदि आपकी तालिका में कोई अशक्त फ़ील्ड है, तो coalesce . जैसी किसी चीज़ का उपयोग करना याद रखें अन्यथा, परिणाम विषम हो सकते हैं क्योंकि null मान किसी भी चीज़ के बराबर नहीं होते हैं।

    UPDATE  Products_Temp tmp INNER JOIN Products p ON tmp.ProductID = p.ProductID
    SET     tmp.Status = 'Unchanged'
    WHERE   p.ProductName = tmp.ProductName
    AND     p.Stock = tmp.Stock
    ... 

नई पहचान करें

पहले की तरह, "नए" रिकॉर्ड की पहचान करने के लिए बाहरी जुड़ाव का उपयोग करें।

    UPDATE  Products_Temp tmp LEFT JOIN Products p ON tmp.ProductID = p.ProductID
    SET     tmp.Status = 'New'
    WHERE   p.ProductID IS NULL

उन्मूलन की प्रक्रिया से, अस्थायी तालिका में अन्य सभी रिकॉर्ड "बदले गए" हैं। एक बार जब आप स्थितियों की गणना कर लेते हैं, तो आप उत्पाद तालिका को अपडेट कर सकते हैं:

    /*  update changed products */
    UPDATE Products p INNER JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.ProductName = tmp.ProductName
           , p.Stock = tmp.Stock
           , ...
           , p.DateLastChanged = now()
           , p.IsDiscontinued = 0
    WHERE  tmp.status = 'Changed'

    /*  insert new products */
    INSERT INTO Products ( ProductName, Stock, DateLastChanged, IsDiscontinued, .. )
    SELECT tmp.ProductName, tmp.Stock, now() AS DateLastChanged, 0 AS IsDiscontinued, ...
    FROM   Products_Temp tmp
    WHERE  tmp.Status = 'New'

    /* flag deleted records */
    UPDATE Products p LEFT JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.DateLastChanged = now()
           , p.IsDiscontinued = 1
    WHERE  tmp.ProductID IS NULL


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. केस संवेदनशील होने के लिए मैसकल टेबल कॉलम को बदलना

  2. मूल MySQL प्रश्न

  3. mysql_data_seek pdo समकक्ष

  4. PHP MySQL में अल्पविराम से अलग स्ट्रिंग से सटीक मान ढूँढना

  5. SQL कथन में NOT IN को LEFT JOIN से बदलें