आपके प्रश्न में विभिन्न परस्पर विरोधी आवश्यकताएं व्यक्त की गई हैं। यह उत्तर इसके "लॉक रखें" पहलू पर केंद्रित है।
पूरे ऑपरेशन के लिए टेबल लॉक बनाए रखने के लिए, आपको एसक्यूएल सर्वर से एक ही कनेक्शन बनाए रखना होगा। एक तरीका यह होगा कि mysql कमांड लाइन क्लाइंट के सिंगल इनवोकेशन के लिए मल्टी-लाइन मल्टी-कमांड इनपुट के रूप में सब कुछ पास किया जाए। मूल रूप से इस तरह:
{ echo "LOCK TABLES Table1 WRITE"
for i in "${infiles[@]}"; do
echo "LOAD DATA LOCAL INFILE '${i}'"
done
} | mysql
यह तब तक काम करेगा जब तक आप डेटाबेस से प्रश्न पूछे बिना सभी आवश्यक विवरण उत्पन्न कर सकते हैं (जैसे अधिकतम पहचानकर्ता) जबकि ताला रखा जाता है।
रीड ऑपरेशंस को मिक्स करने के लिए (जैसे कि मैक्सिमम वैल्यू के लिए पूछना) और ऑपरेशंस लिखना (जैसे कुछ फाइलों की सामग्री लोड करना), आपको सर्वर के साथ एक द्विदिश संचार की आवश्यकता होगी। इसे बैश के माध्यम से हासिल करना बहुत मुश्किल है, इसलिए मैं इसके खिलाफ सलाह दूंगा। यहां तक कि अगर आपको प्रश्न पूछने की आवश्यकता नहीं है, तो बैश पाइप द्वारा प्रदान किया गया यूनिडायरेक्शनल कनेक्शन खतरे का एक स्रोत है:यदि mysql की ओर से कुछ भी गलत होता है, तो बैश नोटिस नहीं करेगा और वैसे भी अगला कमांड जारी करेगा। आप असंगत डेटा कर सकते हैं।
इन कारणों से, मैं कुछ स्क्रिप्टिंग भाषा का सुझाव दूंगा जिसके लिए MySQL बाइंडिंग उपलब्ध हैं, जैसे पर्ल या पायहोन विकल्पों का आपने उल्लेख किया है। उन भाषाओं में सीवीएस फाइलें पढ़ना आसान है, इसलिए आप एक ही स्क्रिप्ट में निम्नलिखित सभी काम कर सकते हैं:
- टेबल लॉक करें
- लेनदेन शुरू करें
- इनपुट csv फ़ाइलें पढ़ें
- अधिकतम आईडी जैसे प्रश्न पूछें
- टेबल लेआउट से मिलान करने के लिए इनपुट डेटा समायोजित करें
- तालिकाओं में डेटा डालें
- यदि कोई त्रुटि नहीं हुई, तो लेन-देन करें