MySQL में बैच इंसर्ट कैसे करें


148

मेरे पास 1-कई रिकॉर्ड हैं, जिन्हें तालिका में दर्ज करने की आवश्यकता है। क्वेरी में ऐसा करने का सबसे अच्छा तरीका क्या है? क्या मुझे सिर्फ एक लूप बनाना चाहिए और प्रति पुनरावृत्ति में एक रिकॉर्ड डालना चाहिए? या कोई बेहतर तरीका है?


1
उपयोग करने का प्रयास करने से पहले कृपया किसी वक्तव्य या कार्य के लिए प्रलेखन पढ़ें। INSERTइस मूल का समर्थन करता है !
ऑर्बिट

3
यदि आपके पास वास्तव में बड़ी संख्या में रिकॉर्ड हैं और उन्हें CSV फ़ाइल के रूप में प्रारूपित किया जा सकता है, तो LOAD DATA INFILE कथन या mysqlimport कमांड देखें।
1

रिकॉर्ड के लिए, लोड डेटा एक बहुत ही लचीली कमांड है जिसमें सीएसवी इनपुट की आवश्यकता नहीं होती है ; कोई भी पाठ प्रारूप करेगा, और इनपुट डेटा को पार्स और हेरफेर करने के लिए कई सहायक पैरामीटर हैं। यह निश्चित रूप से स्थानीय db में डेटा लोड करने का सबसे तेज़ तरीका है। यह स्पष्ट नहीं है कि ऊपर "सर्वश्रेष्ठ" का क्या अर्थ है: अर्थात क्या सादगी (INSERT बयानों का उपयोग करें) ट्रम्प गति (LOAD डेटा का उपयोग करें)।
एडवर्डगार्सन

जवाबों:


298

से MySQL मैनुअल

वैल्यू सिंटैक्स का उपयोग करने वाले INSERT स्टेटमेंट कई पंक्तियों को सम्मिलित कर सकते हैं। ऐसा करने के लिए, कॉलम मानों की एकाधिक सूचियों को शामिल करें, प्रत्येक कोष्ठक के भीतर संलग्न और अल्पविराम द्वारा अलग किया गया। उदाहरण:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

7
क्या यह लोड डेटा इन्फ़ाइल की तुलना में धीमा है?
20

संग्रहीत कार्यविधि में इस सम्मिलित कथन को लिखने के लिए वाक्यविन्यास क्या है?
नितिन सावंत

@ नितिन यह एक ही वाक्य रचना नहीं होगा .. ??? मैं वैसे भी SQL Server में क्या करूँगा।
विज्ञापन

13
कृपया ध्यान दें कि जब प्रश्न " बैच आवेषण कैसे करें" लेबल किया जाता है, तो यह उत्तर वास्तव में थोक प्रविष्टि है। बल्क आमतौर पर तेज होता है, इस प्रश्न को
माइक डेमोनोक

2
@ केफिउस प्रति इस SO उत्तर से @Lukman से, डाले जा सकने वाले मानों / पंक्तियों की संख्याmax_allowed_packet
Sepster

22

अधिकांश समय, आप MySQL क्लाइंट में काम नहीं कर रहे हैं और आपको उपयुक्त एपीआई का उपयोग करके एक साथ बैच आवेषण करना चाहिए।

जैसे JDBC में:

connection con.setAutoCommit(false); 
PreparedStatement prepStmt = con.prepareStatement("UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
prepStmt.setString(1,mgrnum1);                 
prepStmt.setString(2,deptnum1);
prepStmt.addBatch();

prepStmt.setString(1,mgrnum2);                        
prepStmt.setString(2,deptnum2);
prepStmt.addBatch();

int [] numUpdates=prepStmt.executeBatch();

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/tjvbtupd.htm


5
बैच आवेषण पर एक अच्छा ब्लॉग प्रविष्टि (जावा में, लेकिन यह किसी भी भाषा के लिए प्रासंगिक है): viralpatel.net/blogs/batch-insert-in-java-jdbc
Kangur


6

लोड डेटा इनफ़िल्ट क्वेरी बहुत बेहतर विकल्प है, लेकिन कुछ सर्वर जैसे गोडैडी इस विकल्प को साझा होस्टिंग पर प्रतिबंधित करते हैं, केवल दो विकल्प बचे हैं, फिर प्रत्येक पुनरावृत्ति या बैच इंसर्ट पर एक रिकॉर्ड डाला जाता है, लेकिन यदि आपकी क्वेरी इससे अधिक है, तो बैच इन्सर्ट में इसके लिमिडेट वर्ण हैं। mysql में सेट किए गए वर्णों की संख्या, फिर आपकी क्वेरी क्रैश हो जाएगी, इसलिए मेरा सुझाव है कि चांस में डेटा डालें बैच डालने के साथ, इससे डेटाबेस के साथ स्थापित कनेक्शन की संख्या कम हो जाएगी। भाग्य के लोग


1
कैसे के बारे मेंLOAD DATA LOCAL INFILE '/users/name/txt.file'
double_j

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.