ऑटो-इंक्रीमेंट काउंटर केवल मुख्य मेमोरी में संग्रहीत किया जाता है, डिस्क पर नहीं।
http://dev.mysql.com/doc/refman/4.1/en/innodb-auto-increment-handling.html
इसके कारण जब सेवा (या सर्वर) पुनः आरंभ होता है तो निम्न होगा:
सर्वर स्टार्टअप के बाद, तालिका में पहली बार सम्मिलित करने के लिए, InnoDB इस कथन के समतुल्य निष्पादित करता है: अद्यतन MAX (ai_col) FROM t for UPDATE;
InnoDB एक विवरण द्वारा प्राप्त मूल्य से वृद्धि करता है और इसे स्तंभ और तालिका के लिए ऑटो-वृद्धि काउंटर पर असाइन करता है। यदि तालिका खाली है, तो InnoDB मान 1 का उपयोग करता है।
सादे अंग्रेजी में, MySQL सेवा शुरू होने के बाद यह पता नहीं है कि आपकी मेज के लिए ऑटो-इंक्रीमेंट मूल्य क्या होना चाहिए। इसलिए जब आप पहली बार एक पंक्ति सम्मिलित करते हैं, तो यह उस क्षेत्र का अधिकतम मूल्य पाता है जो ऑटो-इंक्रीमेंट का उपयोग करता है, इस मूल्य में 1 जोड़ता है, और परिणामी मूल्य का उपयोग करता है। यदि कोई पंक्तियाँ नहीं हैं, तो यह 1 पर शुरू होगी।
यह हमारे लिए एक समस्या थी, क्योंकि हम टेबल और mysql के ऑटो-इन्क्रीमेंट फ़ीचर का उपयोग बहु-थ्रेडेड वातावरण में IDs को बड़े करीने से प्रबंधित करने के लिए कर रहे थे जहाँ उपयोगकर्ताओं को तृतीय-पक्ष भुगतान साइट पर पुनः निर्देशित किया जा रहा था। इसलिए हमें यह सुनिश्चित करना था कि आईडी थर्ड पार्टी को मिले और हमें वापस भेजे जाने का तरीका अनूठा था और इस तरह से रहेगा (और निश्चित रूप से उपयोगकर्ता द्वारा लेनदेन को रद्द किए जाने के बाद उपयोगकर्ता को रद्द करना होगा)।
इसलिए हम एक पंक्ति बना रहे थे, उत्पन्न ऑटो-इन्क्रिमेंट मान प्राप्त कर रहे थे, तालिका को साफ रखने के लिए पंक्ति को हटा रहे थे, और मूल्य को भुगतान साइट पर अग्रेषित कर रहे थे। जिस तरह से एएनओडीबी हैंडल करता है उसे एआई मानों के मुद्दे को ठीक करने के लिए हमने समाप्त किया था जो निम्नलिखित था:
$query = "INSERT INTO transactions_counter () VALUES ();";
mysql_query($query);
$transactionId = mysql_insert_id();
$previousId = $transactionId - 1;
$query = "DELETE FROM transactions_counter WHERE transactionId='$previousId';";
mysql_query($query);
यह हमेशा टेबल में एक पंक्ति के रूप में उत्पन्न नवीनतम ट्रांजैक्शन को चालू रखता है, बिना अनावश्यक रूप से तालिका को उड़ाए बिना।
आशा है कि किसी और की मदद करता है जो इसमें भाग सकता है।
संपादित करें (2018-04-18) :
जैसा कि नीचे उल्लेख चालाकी से प्रतीत होता है कि इस का व्यवहार MySQL 8.0+ में संशोधित किया गया है।
https://dev.mysql.com/worklog/task/?id=6204
उस कार्यक्षेत्र में शब्दांकन सबसे अच्छा दोषपूर्ण है, हालांकि यह उन नए संस्करणों में InnoDB दिखाई देता है जो अब रिबूट में लगातार ऑटोइनक मानों का समर्थन करते हैं।
-Gremio