MySQL - मैं एक एकल INSERT स्टेटमेंट में कितनी पंक्तियाँ डाल सकता हूँ?


91

क्या यह मान सेट की संख्या पर निर्भर करता है? क्या यह INSERT बयान में बाइट्स की संख्या पर निर्भर करता है?

जवाबों:


93

आप INSERT ... SELECTपैटर्न का उपयोग करके असीम रूप से बड़ी संख्या में रिकॉर्ड सम्मिलित कर सकते हैं , बशर्ते आपके पास अन्य तालिकाओं में वे रिकॉर्ड या भाग हों।

लेकिन यदि आप INSERT ... VALUESपैटर्न का उपयोग करके मूल्यों को हार्ड-कोडिंग कर रहे हैं , तो इस बात की सीमा है कि आपका कथन कितना बड़ा / लंबा है: max_allowed_packet जो क्लाइंट द्वारा डेटाबेस सर्वर पर भेजे गए SQL कथनों की लंबाई को सीमित करता है, और यह किसी भी प्रकार के प्रश्नों को प्रभावित करता है और न केवल INSERT बयान के लिए।


44

आदर्श रूप से, मैसकल सिंगल इन्सर्ट (एक ही बार में) में अनंत पंक्तियों के निर्माण की अनुमति देता है लेकिन जब ए

MySQL क्लाइंट या mysqld सर्वर एक पैकेट को max_allowed_packet बाइट्स से बड़ा प्राप्त करता है, यह एक पैकेट बहुत बड़ी त्रुटि जारी करता है और कनेक्शन बंद कर देता है।

यह देखने के लिए कि अधिकतम मान के लिए डिफ़ॉल्ट मान क्या है_अधिकांश_पैकेट चर, MySQL में निम्न कमांड निष्पादित करें:

show variables like 'max_allowed_packet';

मानक MySQL अधिष्ठापन का डिफ़ॉल्ट मान 1048576 बाइट्स (1MB) है। इसे सत्र या कनेक्शन के लिए उच्च मान पर सेट करके बढ़ाया जा सकता है।

यह मान सभी के लिए 500MB पर सेट करता है (कि GLOBAL का मतलब क्या है):

SET GLOBAL max_allowed_packet=524288000;

नए कनेक्शन के साथ नए टर्मिनल में अपने परिवर्तन की जाँच करें:

show variables like 'max_allowed_packet';

अब यह अनंत रिकॉर्ड डालने के लिए किसी भी त्रुटि के बिना काम करना चाहिए। धन्यवाद


11
500 एमबी अनंत नहीं है। यह डिफ़ॉल्ट मान की तुलना में बहुत बड़ा है, लेकिन फिर भी, अनंत नहीं है।
कार्लोस २W

एक प्रश्न: वास्तव में इस सीमा के लिए क्या है? क्वेरी ही? डेटा के बारे में क्या, कथन निष्पादित करते समय बाँधें? क्या मैं तब तक सुरक्षित रह सकता हूं strlen($query_with_questionmarks) < $max_alloweed_packet?
पायलेट

यदि आप इसे सबसे बड़े संभावित मान पर सेट करने का प्रयास कर रहे हैं, तो यह 1GB है जो इस तरह दिखेगा: SET GLOBAL max_allowed_packet = 1073741824
PHP गुरु



6

आप एक INSERT विवरण के साथ अनंत संख्या में पंक्तियाँ सम्मिलित कर सकते हैं। उदाहरण के लिए, आप एक संग्रहीत प्रक्रिया निष्पादित कर सकते हैं जिसमें एक लूप हजार बार निष्पादित होता है, प्रत्येक बार INSERT क्वेरी को चलाता है।

या आपका INSERT एक ट्रिगर यात्रा कर सकता है जो खुद एक INSERT करता है। जो एक और ट्रिगर यात्रा करता है। और इसी तरह।

नहीं, यह मूल्य सेट की संख्या पर निर्भर नहीं करता है। न ही यह बाइट्स की संख्या पर निर्भर करता है।

आपके कोष्ठकों को कितनी गहराई से नेस्ट किया जा सकता है, और आपके कुल स्टेटमेंट की अवधि कितनी है, इसकी एक सीमा है। ये दोनों संदर्भित हैं, विडंबना यह है कि thedailywtf.com पर। हालाँकि, मेरे द्वारा बताए गए दोनों साधन इन सीमाओं के आसपास हैं।


आपके उदाहरण कई INSERT को चलाने के लिए हैं, और यह एक INSERT विवरण में कई पंक्तियों को सम्मिलित करने के बारे में नहीं दिखाता है ..
Lukman

@Lukman: एक INSERT क्वेरी के परिणामस्वरूप कई INSERTS डेटाबेस को हिट कर सकते हैं। यह सिर्फ एक की बात है कि कौन क्या गिन रहा है।
बोरेलिड

2
यह सच है, लेकिन आपका पहला उदाहरण एक लूप में चल रहे क्वेरी के बारे में दिखाता है जिसमें प्रत्येक लूप में एक INSERT स्टेटमेंट चल रहा है, और यह उस बारे में कुछ नहीं कहता है कि एक INSERT स्टेटमेंट कई पंक्तियों को सम्मिलित करता है। यह सिर्फ जोर देने की बात है।
लुकमान

कोई भी अनंत कुछ भी नहीं कर सकता है। हमेशा संसाधन सीमाएँ होती हैं।
एड्रिएन

क्या यह चयन ... कथन से भी लागू होता है? मेरा मतलब है कि यदि डेटा को पहले से ही max_allowed_packet के साथ डाला गया है, तो क्या यह उसके बाद चयनित होने के लिए ale नहीं होना चाहिए? मुझे नहीं लगता कि यह अन्य पोस्टर की तरह सभी अन्य कथनों पर लागू होता है क्योंकि जब इसे पहली बार किसी और चीज से पहले डाला जाता है।
थिएलिश

6

आप max_allowed_packet सीमा और हिट करेंगे

त्रुटि: 1390 तैयार बयान में बहुत सारे प्लेसहोल्डर हैं।

आप एक sql में 65535 प्लेसहोल्डर रख सकते हैं। यदि आपके पास एक पंक्ति में दो कॉलम हैं, तो आप एक sql में 32767 पंक्तियाँ डाल सकते हैं।

MySQL में 50K + रिकॉर्ड्स का आयात सामान्य त्रुटि देता है: 1390 तैयार बयान में बहुत अधिक प्लेसहोल्डर हैं


2

मेरा मानना ​​है कि उन पंक्तियों की कोई परिभाषित संख्या नहीं है जो आप INSERT में डालने तक सीमित हैं, लेकिन सामान्य तौर पर प्रश्नों के लिए अधिकतम आकार हो सकता है।


2

यह max_allowed_packet द्वारा सीमित है।
आप का उपयोग करके निर्दिष्ट कर सकते हैं: mysqld --max_allowed_packet=32M यह डिफ़ॉल्ट रूप से 16M है।
आप my.cnf में / etc / mysql / में भी निर्दिष्ट कर सकते हैं

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