मैं PHP के साथ mysql का उपयोग कर रहा हूँ। मेरे पास इस तरह की छात्र तालिका है। मैं इनो डीबी इंजन का उपयोग कर रहा हूं।
id int AUTO_INCREMENT
regno int
name varchar
जब भी कोई नया छात्र डाला जाता है, मैं चाहता हूंअगले उपलब्ध regno असाइन करें। उदाहरण के लिए पिछले छात्र का रेनो 1 है तो मूल्य अगले प्रविष्टि के लिए 2 होना चाहिए। ऑटो वृद्धि यहां काम नहीं करती है क्योंकि यह अंतराल बना सकती है। (मैं लेनदेन का उपयोग कर रहा हूं, इसलिए छात्रों की तालिका में एक पंक्ति डालने के बाद, कुछ और प्रश्न हैं जो रोलबैक का कारण बन सकते हैं, इस मामले में, ऑटो वृद्धि आईडी बढ़ी है हालांकि कोई वास्तविक रिकॉर्ड नहीं डाला गया है)। इसके अलावा, अगर पुरानी regnos के बीच एक अंतर मौजूद है तो मुझे परवाह नहीं है ... उदाहरण के लिए regno अनुक्रम में 1,2,3,5,10,11,12 हो सकता है। अब जब अगला छात्र डाला गया है तो मुझे 12+ 1 = 13 इस छात्र के लिए। साथ ही, मैं यह सुनिश्चित करना चाहता हूं कि regno डुप्लीकेट नहीं है। (हालांकि रेगनो में एक अद्वितीय सूचकांक है, लेकिन मैं त्रुटि फेंकना नहीं चाहता हूं। इसे अगली संख्या मिलनी चाहिए)।
मेरे मन में दो समाधान हैं। 1: (छद्म कोड) ए। Newregno = max (regno) +1 के लिए क्वेरी डेटाबेस ख। पंक्ति डालने के दौरान छात्र को newregno असाइन करें।
इस मामले में मैं केवल चिंतित हूं कि एप्लिकेशन के 2 उदाहरण एक ही समय में डेटाबेस से पूछ सकते हैं और डुप्लिकेट के कारण एक ही न्यूग्रेनो प्राप्त कर सकते हैं।
2: ट्रिगर्स का उपयोग करें ... वास्तविक पंक्ति सम्मिलन के बाद regno अद्यतन करें। (मैंने ट्रिगर्स के बारे में ज्यादा कुछ नहीं पढ़ा है, लेकिन अगर कोई सुझाव देता है कि यह एक बेहतर तरीका है, तो मैं इसके लिए जाऊंगा)
कोई उपाय?
संपादित करें --- Regno (पंजीकरण संख्या) नहीं हो सकता हैभविष्य में अद्वितीय हो लेकिन कुछ अन्य कॉलम के साथ अद्वितीय होगा उदा। पाठ्यक्रम / सत्र। तो कृपया मुझे "ऑटो वृद्धि" इंडेक्स प्रकार समाधान प्रदान न करें।
उत्तर:
जवाब के लिए 0 № 1कृपया एक नज़र इसे देखिये: http://www.mysqlperformanceblog.com/2011/11/29/avoiding-auto-increment-holes-on-innodb-with-insert-ignore/
आईडी की गणना के लिए वृद्धि अलग-अलग एल्गोरिदम का उपयोग करती है। छेद से बचने के लिए आपको इसे सेट करने की आवश्यकता है।