INSERT के साथ mysqldump ... DUPLICATE पर


21

मैं एक डेटाबेस से दूसरे में डेटा मर्ज करना चाहता हूं। इसलिए मैं इसके साथ डंप बनाता हूं mysqldumpऔर फिर इसे दूसरे डेटाबेस (उसी टेबल संरचना के साथ) में आयात करता हूं । मुझे इस मामले में कोई समस्या नहीं है (जैसे डुप्लिकेट प्रविष्टियों या कुछ और)।

लेकिन मैं परीक्षण उद्देश्यों के लिए कुछ मर्ज करता हूं और बाद में अंतिम मर्ज करूंगा। इसलिए, मैं कुछ बार मर्ज (डेटा बदला जा सकता है) निष्पादित करना चाहता हूं। ध्यान दें, मेरी तालिकाओं में मेरी पंक्तियाँ कभी हटती नहीं हैं, केवल डाली या अपडेट की जा सकती हैं।

क्या मैं DUPLICATE विकल्प पर mysqldump बना सकता हूं? या क्या मैं डंप को मर्ज कर सकता हूं जो नए डेटा को सम्मिलित करता है और संशोधित डेटा को अपडेट करता है?

ज़रूर, मैं ON DUPLICATEडंप में मैन्युअल रूप से सम्मिलित कर सकता हूं , लेकिन मैं मर्ज प्रक्रिया को स्वचालित करना चाहता हूं।

जवाबों:


34

इसमें आपकी मदद करने के लिए विकल्प हैं:

  --insert-ignore     Insert rows with INSERT IGNORE.
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -t, --no-create-info
                      Don't write table creation info.

इस प्रतिमान को ध्यान में रखें

  • DB1 से DUMP1 में सब कुछ mysqldump
  • DUMP1 को DB3 में लोड करें
  • DB2 से सब कुछ mysqldump --replace (या --inster- इग्नोर) और DUMP2 में -no-create-info का उपयोग कर
  • DUMP2 को DB3 में लोड करें

1
एक मिनट प्रतीक्षा करें: --replace का अर्थ है कि DB2 डेटा DB1 डेटा को अधिलेखित कर देगा, और --inster-ign का उपयोग करने का अर्थ है कि DB1 डेटा प्रबल है। सवाल यह लगता है कि डुप्लिकेट कुंजियों के मामले में UPDATE कैसे करें। किसी भी मामले में, मैं जानना चाहूंगा।
एडवर्ड नेवेल

@EdwardNewell कृपया ध्यान दें कि हर कॉलम पर --replaceकरने के बराबर है ON DUPLICATE UPDATE। दुर्भाग्य से, mysqldump के थोक लोडिंग और डंपिंग प्रकृति के कारण विशिष्ट कॉलम को अपडेट करने के लिए डिज़ाइन नहीं किया गया है। मेरा जवाब बस यह बताता है कि mysqldump क्या करने में सक्षम है। आपको करने के लिए mysqldump के अलावा कस्टम कोड लिखना होगा ON DUPLICATE UPDATE
रोलैंडम्यूसीडीडीबीए

जब तक DB1 और 2 में एक ही स्कीमा है, आप सही हैं। लेकिन मान लें कि DB1 में अतिरिक्त क्षेत्र हैं। तब --replace अतिरिक्त फ़ील्ड को केवल साझा किए गए फ़ील्ड को अपडेट करने के बजाय डिफॉल्ट्स (या यदि कोई डिफ़ॉल्‍ट नहीं हैं तो त्रुटि) के लिए वापस ले जाएगा। मुझे पता है ओ पी की स्थिति में एक ही स्कीमा के साथ दो डेटाबेस के लिए है, लेकिन अभी उनका कहना है कि है एक अंतर है, और यह कुछ मामलों में एक सच्चे अद्यतन प्रकार डंप करने के लिए उपयोगी होगा (मैं अब एक का सामना करना पड़ रहा हूँ!)
एडवर्ड नेवेल

1
ध्यान दें कि यदि रिकॉर्ड के अपडेट होने की ओर इशारा करने वाली विदेशी चाबियां हैं, तो उपयोग करना REPLACE INTOविफल हो सकता है क्योंकि रिकॉर्ड को उन रिश्तों को अलग करने के साथ हटाया नहीं जा सकता है। यदि आपके पास है ON DELETE CASCADE, तो आप उन तालिकाओं को खाली कर देंगे जो अद्यतन किए जाने पर निर्भर करते हैं। REPLACE INTOकाफी खतरनाक ऑपरेशन है।
क्रिस्टोफर शुल्त्स

1
@ रोलैंडमाइसीडीडीबीए सहमत। मैं सिर्फ टिप्पणी करना चाहता था ताकि कोई भी इस उत्तर को पढ़े, समझे कि ये विकल्प (विशेष रूप से REPLACE INTO) खतरनाक हो सकते हैं और "आश्चर्यजनक" प्रभाव डाल सकते हैं। अच्छा जवाब - बस एक चेतावनी जोड़ना चाहते थे।
क्रिस्टोफर शुल्त्ज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.