MySQL AUTO_INCREMENT उदाहरण सहित
⚡ स्मार्ट सारांश
MySQL AUTO_INCREMENT हर बार पंक्ति सम्मिलित होने पर संख्यात्मक कॉलम के लिए अनुक्रमिक संख्याएँ स्वचालित रूप से उत्पन्न करता है। यह विशेषता अद्वितीय पहचानकर्ताओं की मैन्युअल गणना की आवश्यकता को समाप्त करती है, जिससे यह प्राथमिक कुंजी को भरने का मानक तरीका बन जाता है।

ऑटो इंक्रीमेंट क्या है?
ऑटो इंक्रीमेंट एक ऐसा फ़ंक्शन है जो संख्यात्मक डेटा प्रकारों पर काम करता है। यह स्वचालित रूप से अनुक्रमिक संख्यात्मक मान उत्पन्न करता है जब भी ऑटो इंक्रीमेंट के रूप में परिभाषित फ़ील्ड के लिए तालिका में रिकॉर्ड डाला जाता है।
यह विशेषता TINYINT से लेकर BIGINT तक किसी भी पूर्णांक प्रकार पर काम करती है। कॉलम का अनुक्रमण भी आवश्यक है, जो प्राथमिक कुंजी घोषित किए जाने पर स्वतः हो जाता है।
ऑटो इंक्रीमेंट का उपयोग कब करें?
इस पाठ में डेटाबेस सामान्यीकरणहमने देखा कि डेटा को न्यूनतम अतिरेक के साथ कैसे संग्रहीत किया जा सकता है, डेटा को कई छोटी तालिकाओं में संग्रहीत करके, जो प्राथमिक और विदेशी कुंजियों का उपयोग करके एक दूसरे से संबंधित होती हैं।
प्राथमिक कुंजी अद्वितीय होनी चाहिए, क्योंकि यह डेटाबेस में एक पंक्ति को विशिष्ट रूप से पहचानती है। लेकिन हम यह कैसे सुनिश्चित कर सकते हैं कि प्राथमिक कुंजी हमेशा अद्वितीय हो?
एक संभावित समाधान यह हो सकता है कि प्राथमिक कुंजी उत्पन्न करने के लिए एक सूत्र का उपयोग किया जाए, जो डेटा जोड़ने से पहले तालिका में कुंजी की उपस्थिति की जाँच करता है। यह कारगर हो सकता है, लेकिन यह तरीका जटिल है और पूरी तरह सुरक्षित नहीं है। एक ही समय में डेटा डालने वाले दो सत्र अभी भी एक ही अधिकतम मान पढ़ सकते हैं और टकराव पैदा कर सकते हैं।
इस तरह की जटिलता से बचने और यह सुनिश्चित करने के लिए कि प्राथमिक कुंजी हमेशा अद्वितीय हो, हम इसका उपयोग कर सकते हैं। MySQL प्राथमिक कुंजी उत्पन्न करने के लिए ऑटो इंक्रीमेंट सुविधा का उपयोग किया जाता है। ऑटो इंक्रीमेंट का उपयोग INT डेटा प्रकार के साथ किया जाता है। INT डेटा प्रकार हस्ताक्षरित और अहस्ताक्षरित दोनों मानों का समर्थन करता है। अहस्ताक्षरित डेटा प्रकारों में केवल धनात्मक संख्याएँ ही हो सकती हैं। सर्वोत्तम अभ्यास के रूप में, ऑटो इंक्रीमेंट प्राथमिक कुंजी पर अहस्ताक्षरित बाधा को परिभाषित करने की अनुशंसा की जाती है।
स्वचालित वृद्धि सिंटैक्स
तर्क स्पष्ट हो जाने के बाद, फिल्म श्रेणियों की तालिका बनाने के लिए उपयोग की गई स्क्रिप्ट को देखें।
CREATE TABLE `categories` ( `category_id` int UNSIGNED NOT NULL AUTO_INCREMENT, `category_name` varchar(150) DEFAULT NULL, `remarks` varchar(500) DEFAULT NULL, PRIMARY KEY (`category_id`) );
category_id फ़ील्ड पर "AUTO_INCREMENT" पर ध्यान दें। इससे हर बार टेबल में नई पंक्ति डालने पर श्रेणी आईडी स्वचालित रूप से उत्पन्न होती है। टेबल में डेटा डालते समय इसे प्रदान नहीं किया जाता है। MySQL इसे उत्पन्न करता है.
नोट: UNSIGNED कीवर्ड कॉलम की धनात्मक सीमा को दोगुना कर देता है, और डिस्प्ले चौड़ाई जिसे पहले int(11) के रूप में लिखा जाता था, अब अप्रचलित हो गई है। MySQL 8.0.17 से आगे। सादा int यह वर्तमान स्वरूप है।
डिफ़ॉल्ट रूप से, AUTO_INCREMENT का प्रारंभिक मान 1 होता है, और प्रत्येक नए रिकॉर्ड के लिए यह 1 से बढ़ता जाएगा।
आइए श्रेणियों की तालिका की वर्तमान सामग्री की जांच करें।
SELECT * FROM `categories`;
उपरोक्त स्क्रिप्ट को निष्पादित करना MySQL myflixdb के विरुद्ध वर्कबेंच चलाने पर हमें निम्नलिखित परिणाम प्राप्त होते हैं।
| category_id | category_name | remarks |
|---|---|---|
| 1 | Comedy | Movies with humour |
| 2 | Romantic | Love stories |
| 3 | Epic | Story acient movies |
| 4 | Horror | NULL |
| 5 | Science Fiction | NULL |
| 6 | Thriller | NULL |
| 7 | Action | NULL |
| 8 | Romantic Comedy | NULL |
आठ पंक्तियाँ मौजूद हैं, इसलिए अगली जनरेट की गई आईडी 9 होनी चाहिए। अब आइए श्रेणियों की तालिका में केवल नाम प्रदान करके एक नई श्रेणी डालें।
INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');
myflixdb के विरुद्ध उपरोक्त स्क्रिप्ट निष्पादित करना MySQL कार्यक्षेत्र हमें नीचे दिखाए गए निम्नलिखित परिणाम मिलते हैं।
| category_id | category_name | remarks |
|---|---|---|
| 1 | Comedy | Movies with humour |
| 2 | Romantic | Love stories |
| 3 | Epic | Story acient movies |
| 4 | Horror | NULL |
| 5 | Science Fiction | NULL |
| 6 | Thriller | NULL |
| 7 | Action | NULL |
| 8 | Romantic Comedy | NULL |
| 9 | Cartoons | NULL |
कृपया ध्यान दें कि हमने श्रेणी आईडी प्रदान नहीं की है। MySQL यह स्वचालित रूप से उत्पन्न हुआ, क्योंकि श्रेणी आईडी को ऑटो इंक्रीमेंट के रूप में परिभाषित किया गया है।
यदि आप अंतिम इन्सर्ट आईडी प्राप्त करना चाहते हैं जो इसके द्वारा उत्पन्न की गई थी MySQL, आप ऐसा करने के लिए LAST_INSERT_ID फ़ंक्शन का उपयोग कर सकते हैं। नीचे दिखाई गई स्क्रिप्ट अंतिम आईडी प्राप्त करती है जो उत्पन्न की गई थी।
SELECT LAST_INSERT_ID();
उपरोक्त स्क्रिप्ट को चलाने पर INSERT क्वेरी द्वारा जनरेट किया गया अंतिम ऑटो इंक्रीमेंट नंबर प्राप्त होता है। परिणाम नीचे दिखाए गए हैं।
सुझाव: LAST_INSERT_ID() का दायरा आपके अपने कनेक्शन तक सीमित है, इसलिए किसी अन्य उपयोगकर्ता द्वारा किए गए इंसर्ट से उत्पन्न मान गलती से भी आपको वापस नहीं भेजा जा सकता है।
ऑटो_इंक्रीमेंट का प्रारंभिक मान कैसे सेट या रीसेट करें
डिफ़ॉल्ट क्रम 1 से शुरू होता है, लेकिन परियोजना की आवश्यकता हमेशा यही नहीं होती। चालान संख्याएँ किसी पुराने सिस्टम से जारी रखनी पड़ सकती हैं, और अक्सर परीक्षण तालिका को रीसेट करना पड़ता है। MySQL काउंटर को सीधे तौर पर प्रदर्शित करता है, इसलिए दोनों मामलों को एक ही क्लॉज़ से संभाला जाता है। शुरुआती संख्या को नियंत्रित करने के लिए इन चरणों का पालन करें।
- निर्माण के समय मान निर्धारित करें। CREATE TABLE स्टेटमेंट में AUTO_INCREMENT क्लॉज़ जोड़ें। इससे इंसर्ट की गई पहली पंक्ति को 1 के बजाय वह संख्या प्राप्त होगी।
- किसी मौजूदा टेबल में मान बदलें। उपयोग तालिका में परिवर्तन उसी खंड के साथ। MySQL यह नए नंबर को तभी स्वीकार करता है जब वह वर्तमान में संग्रहीत सबसे बड़े पहचानकर्ता से अधिक हो।
- उस टेबल को रीसेट करें जिसे आपने खाली कर दिया है। TRUNCATE TABLE एक ही ऑपरेशन में सभी पंक्तियों को हटा देता है और काउंटर को 1 पर वापस कर देता है, जो कि अकेले DELETE नहीं कर पाता है।
- परिवर्तन की पुष्टि करें। नई अनुक्रम पर निर्भर होने से पहले LAST_INSERT_ID() का उपयोग करके एक पंक्ति डालें और पहचानकर्ता को वापस पढ़ें।
-- Start a brand-new table at 1000 CREATE TABLE `invoices` ( `invoice_id` int UNSIGNED NOT NULL AUTO_INCREMENT, `amount` decimal(10,2), PRIMARY KEY (`invoice_id`) ) AUTO_INCREMENT = 1000; -- Move the counter on an existing table ALTER TABLE `categories` AUTO_INCREMENT = 100; -- Empty the table and reset the counter to 1 TRUNCATE TABLE `categories`;
स्टेप साइज़ को auto_increment_increment सिस्टम वेरिएबल के साथ भी बदला जा सकता है, लेकिन यह किसी एक टेबल के बजाय पूरे सर्वर पर लागू होता है। इसका उपयोग मुख्य रूप से रेप्लिकेशन में किया जाता है, जहाँ दो सर्वरों को एक ही आइडेंटिफ़ायर जनरेट नहीं करना चाहिए।
ऑटो-इंक्रीमेंट अनुक्रम में अंतराल क्यों दिखाई देते हैं?
कुछ समय बाद किसी तालिका में 1, 2, 5, 6 जैसे पहचानकर्ता दिखाई देने लगते हैं। इसमें कोई गड़बड़ी नहीं है। काउंटर को संख्याओं की निर्बाध श्रृंखला की गारंटी देने के बजाय, उनकी विशिष्टता सुनिश्चित करने के लिए डिज़ाइन किया गया है, और यह कभी भी एक ही मान दो बार नहीं देता है।
निम्नलिखित कारणों से अंतराल उत्पन्न होते हैं।
- हटाई गई पंक्तियाँ: जब किसी टेबल से कोई पंक्ति हटाई जाती है, तो उसकी स्वतः वृद्धि वाली आईडी का पुनः उपयोग नहीं किया जाता है। MySQL क्रमिक रूप से नई संख्याएँ उत्पन्न करना जारी रखता है।
- वापस लिए गए लेन-देन: इंसर्ट ऑपरेशन चलने के तुरंत बाद ही नंबर का उपयोग हो जाता है। यदि ट्रांजैक्शन को रोलबैक किया जाता है, तो पंक्ति गायब हो जाती है लेकिन नंबर पहले ही उपयोग हो चुका होता है।
- असफल प्रविष्टियाँ: एक UNIQUE बाधा द्वारा अस्वीकृत कथन विफल होने से पहले भी एक पहचानकर्ता का उपभोग कर सकता है।
- थोक इन्सर्ट: InnoDB एक से अधिक पंक्तियों को सम्मिलित करने के लिए संख्याओं का एक ब्लॉक आरक्षित कर सकता है और उपयोग में न आने वाली संख्याओं को छोड़ सकता है।
इन कमियों को दूर करने की कोशिश करना एक गलती है। पंक्तियों को पुनः क्रमांकित करने से उन पर इंगित करने वाली सभी विदेशी कुंजियाँ टूट जाती हैं, और स्वयं उस मान का कोई व्यावसायिक अर्थ नहीं होता। यदि किसी रिपोर्ट को निरंतर सूची की आवश्यकता है, तो संग्रहीत डेटा को पुनः लिखने के बजाय क्वेरी में पंक्ति संख्या उत्पन्न करें।

