दोनों प्रतिक्रियाओं में संभावनाएं हैं। बस अपने विकल्पों पर थोड़ा विस्तार करने के लिए ..
विकल्प #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