MySQL AUTO_INCREMENT उदाहरण सहित

⚡ स्मार्ट सारांश

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

  • 🔢 मूल व्यवहार: AUTO_INCREMENT हर बार नई पंक्ति सम्मिलित होने पर अनुक्रम में अगली संख्या जारी करता है, जो 1 से शुरू होकर आगे बढ़ती है।ping 1 द्वारा।
  • 🔑 प्राथमिक प्रमुख भूमिका: यह विशेषता बिना किसी लुकअप क्वेरी के एक अद्वितीय पहचानकर्ता की गारंटी देती है, इसलिए यह सरोगेट प्राइमरी की के लिए मानक विकल्प है।
  • 🧱 स्तंभ की आवश्यकताएँ: कॉलम पूर्णांक प्रकार का होना चाहिए और अनुक्रमित होना चाहिए, जो कि प्राथमिक कुंजी घोषणा पहले से ही संतुष्ट करती है।
  • पैटर्न डालें: INSERT स्टेटमेंट से आइडेंटिफायर कॉलम को हटा दें और MySQL यह मान प्रदान करता है, फिर LAST_INSERT_ID() इसे लौटाता है।
  • कस्टम प्रारंभ मान: CREATE TABLE या ALTER TABLE कमांड AUTO_INCREMENT = 10 को स्वीकार करता है ताकि अनुक्रम को चुनी हुई संख्या से शुरू किया जा सके।
  • कमियों की अपेक्षा रखें: हटाई गई पंक्तियाँ और रोलबैक किए गए लेनदेन संख्याओं को स्थायी रूप से नष्ट कर देते हैं, इसलिए अनुक्रम अद्वितीय रहता है लेकिन सन्निहित नहीं रहता है।

MySQL स्वयं वेतन वृद्धि

ऑटो इंक्रीमेंट क्या है?

ऑटो इंक्रीमेंट एक ऐसा फ़ंक्शन है जो संख्यात्मक डेटा प्रकारों पर काम करता है। यह स्वचालित रूप से अनुक्रमिक संख्यात्मक मान उत्पन्न करता है जब भी ऑटो इंक्रीमेंट के रूप में परिभाषित फ़ील्ड के लिए तालिका में रिकॉर्ड डाला जाता है।

यह विशेषता TINYINT से लेकर BIGINT तक किसी भी पूर्णांक प्रकार पर काम करती है। कॉलम का अनुक्रमण भी आवश्यक है, जो प्राथमिक कुंजी घोषित किए जाने पर स्वतः हो जाता है।

ऑटो इंक्रीमेंट का उपयोग कब करें?

इस पाठ में डेटाबेस सामान्यीकरणहमने देखा कि डेटा को न्यूनतम अतिरेक के साथ कैसे संग्रहीत किया जा सकता है, डेटा को कई छोटी तालिकाओं में संग्रहीत करके, जो प्राथमिक और विदेशी कुंजियों का उपयोग करके एक दूसरे से संबंधित होती हैं।

MySQL AUTO_INCREMENT उदाहरण सहित

प्राथमिक कुंजी अद्वितीय होनी चाहिए, क्योंकि यह डेटाबेस में एक पंक्ति को विशिष्ट रूप से पहचानती है। लेकिन हम यह कैसे सुनिश्चित कर सकते हैं कि प्राथमिक कुंजी हमेशा अद्वितीय हो?

एक संभावित समाधान यह हो सकता है कि प्राथमिक कुंजी उत्पन्न करने के लिए एक सूत्र का उपयोग किया जाए, जो डेटा जोड़ने से पहले तालिका में कुंजी की उपस्थिति की जाँच करता है। यह कारगर हो सकता है, लेकिन यह तरीका जटिल है और पूरी तरह सुरक्षित नहीं है। एक ही समय में डेटा डालने वाले दो सत्र अभी भी एक ही अधिकतम मान पढ़ सकते हैं और टकराव पैदा कर सकते हैं।

इस तरह की जटिलता से बचने और यह सुनिश्चित करने के लिए कि प्राथमिक कुंजी हमेशा अद्वितीय हो, हम इसका उपयोग कर सकते हैं। 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 क्वेरी द्वारा जनरेट किया गया अंतिम ऑटो इंक्रीमेंट नंबर प्राप्त होता है। परिणाम नीचे दिखाए गए हैं।

MySQL स्वयं वेतन वृद्धि

सुझाव: LAST_INSERT_ID() का दायरा आपके अपने कनेक्शन तक सीमित है, इसलिए किसी अन्य उपयोगकर्ता द्वारा किए गए इंसर्ट से उत्पन्न मान गलती से भी आपको वापस नहीं भेजा जा सकता है।

ऑटो_इंक्रीमेंट का प्रारंभिक मान कैसे सेट या रीसेट करें

डिफ़ॉल्ट क्रम 1 से शुरू होता है, लेकिन परियोजना की आवश्यकता हमेशा यही नहीं होती। चालान संख्याएँ किसी पुराने सिस्टम से जारी रखनी पड़ सकती हैं, और अक्सर परीक्षण तालिका को रीसेट करना पड़ता है। MySQL काउंटर को सीधे तौर पर प्रदर्शित करता है, इसलिए दोनों मामलों को एक ही क्लॉज़ से संभाला जाता है। शुरुआती संख्या को नियंत्रित करने के लिए इन चरणों का पालन करें।

  1. निर्माण के समय मान निर्धारित करें। CREATE TABLE स्टेटमेंट में AUTO_INCREMENT क्लॉज़ जोड़ें। इससे इंसर्ट की गई पहली पंक्ति को 1 के बजाय वह संख्या प्राप्त होगी।
  2. किसी मौजूदा टेबल में मान बदलें। उपयोग तालिका में परिवर्तन उसी खंड के साथ। MySQL यह नए नंबर को तभी स्वीकार करता है जब वह वर्तमान में संग्रहीत सबसे बड़े पहचानकर्ता से अधिक हो।
  3. उस टेबल को रीसेट करें जिसे आपने खाली कर दिया है। TRUNCATE TABLE एक ही ऑपरेशन में सभी पंक्तियों को हटा देता है और काउंटर को 1 पर वापस कर देता है, जो कि अकेले DELETE नहीं कर पाता है।
  4. परिवर्तन की पुष्टि करें। नई अनुक्रम पर निर्भर होने से पहले 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 एक से अधिक पंक्तियों को सम्मिलित करने के लिए संख्याओं का एक ब्लॉक आरक्षित कर सकता है और उपयोग में न आने वाली संख्याओं को छोड़ सकता है।

इन कमियों को दूर करने की कोशिश करना एक गलती है। पंक्तियों को पुनः क्रमांकित करने से उन पर इंगित करने वाली सभी विदेशी कुंजियाँ टूट जाती हैं, और स्वयं उस मान का कोई व्यावसायिक अर्थ नहीं होता। यदि किसी रिपोर्ट को निरंतर सूची की आवश्यकता है, तो संग्रहीत डेटा को पुनः लिखने के बजाय क्वेरी में पंक्ति संख्या उत्पन्न करें।

अक्सर पूछे जाने वाले प्रश्न

नहीं. MySQL यह प्रति टेबल केवल एक AUTO_INCREMENT कॉलम की अनुमति देता है, और उस कॉलम को इंडेक्स किया जाना चाहिए। इसे इस प्रकार घोषित करना प्राथमिक कुंजी सूचकांक की आवश्यकता को पूरा करता है।

डुप्लिकेट कुंजी त्रुटि के कारण प्रविष्टियाँ दर्ज करने में विफलता आती है, क्योंकि काउंटर डेटा प्रकार की अधिकतम सीमा से आगे नहीं बढ़ सकता। एक अहस्ताक्षरित TINYINT 255 पर रुक जाता है। कृपया इससे पहले कॉलम को BIGINT जैसे व्यापक प्रकार में बदलें।

हाँ, से MySQL 8.0 और उसके बाद के संस्करणों में, InnoDB काउंटर को रीडो लॉग में लिखता है, इसलिए रीस्टार्ट के बाद यह बहाल हो जाता है। पहले के संस्करण इसकी पुनर्गणना करते थे और डिलीट किए गए डेटा द्वारा खाली किए गए नंबरों को फिर से जारी कर सकते थे।

आंशिक रूप से। एआई स्कीमा सहायक जैसे उपकरणों के भीतर MySQL कार्यक्षेत्र आपके द्वारा वर्णित आयतन के लिए पर्याप्त चौड़ाई वाला एक अहस्ताक्षरित पूर्णांक सुझाएँ। अनुमान उतना ही सटीक होगा जितना कि आपके द्वारा दी गई वृद्धि दर, इसलिए इसकी पुष्टि अवश्य करें।

अक्सर, हाँ। एआई क्वेरी सहायक रोल-बैक किए गए लेनदेन, विफल लेनदेन की ओर इशारा करते हैं। सम्मिलित करें स्टेटमेंट में गड़बड़ी और हटाई गई पंक्तियों को सामान्य कारण माना जाता है। स्पष्टीकरण को प्रारंभिक बिंदु मानकर सर्वर लॉग से इसकी पुष्टि करें।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: