ऑटो वेतन वृद्धि सम्मिलित पंक्तियों की संख्या से अधिक क्यों होती है?


11

मैं इस अजीब व्यवहार से बहुत auto_incrementहैरान हूं कि मैं एक संग्रहीत प्रक्रिया का उपयोग करके थोक सम्मिलन करने के बाद एक बोली तालिका की बोली में दर्ज मूल्य में देख रहा हूं :

INSERT INTO Bids (itemID, buyerID, bidPrice)
 SELECT itemID, rand_id(sellerID, user_last_id), FLOOR((1 + RAND())*askPrice)
 FROM Items
 WHERE closing BETWEEN NOW() AND NOW() + INTERVAL 1 WEEK ORDER BY RAND() LIMIT total_rows;

उदाहरण के लिए, यदि auto_incrementबिड का मान प्रारंभ में 101 है, और मैंने 100 पंक्तियों को सम्मिलित किया है, तो अंतिम मूल्य 201 के बजाय 213 हो जाता है। हालांकि, उन सम्मिलित पंक्तियों की बोली, क्रमिक रूप से अधिकतम 201 तक चलती है।

निम्नलिखित की जांच करने के बाद,

SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+

मुझे नहीं पता कि ऐसा क्यों हो रहा है। auto incrementमूल्य में उछाल के कारण क्या हो सकता है ?


MyISAM या InnoDB टेबल?
क्रिस्टियन पोर्टा

@CristianPorta, यह InnoDB है।
प्रश्न ओवरफ्लो

क्या आप अपना show variables like '%innodb_autoinc_lock_mode%';उत्पादन साझा कर सकते हैं ?
क्रिस्टियन पोर्टा

क्या आप सुनिश्चित हैं कि तालिका (पंक्तियाँ सम्मिलित करना) से संबंधित कोई अन्य कनेक्शन / गतिविधि नहीं है?
ypercube y

1
@QuestionOverflow एक अच्छा प्रारंभिक बिंदु: dev.mysql.com/doc/refman/5.5/en/…
क्रिस्टियन पोर्टा

जवाबों:


10

यह असामान्य नहीं है और इसके कुछ कारण हैं। कभी-कभी यह अनुकूलन के कारण होता है क्वेरी धावक काउंटर संसाधन के साथ विवाद के मुद्दों को कम करने के लिए बनाता है, दक्षता में सुधार जब प्रभावित तालिका के समवर्ती अद्यतन होते हैं। कभी-कभी यह लेन-देन के कारण होता है जो स्पष्ट रूप से लुढ़का हुआ होता है (या एक त्रुटि के कारण अंतर्निहित रूप से वापस लुढ़क जाता है)।

केवल एक auto_incrementस्तंभ से गारंटी देता है (या IDENTITYMSSQL में, और अवधारणा द्वारा अन्य नाम जो जाते हैं) यह है कि प्रत्येक मान अद्वितीय होगा और कभी भी पिछले एक से छोटा नहीं होगा: इसलिए आप ऑर्डर करने के लिए मूल्यों पर भरोसा कर सकते हैं लेकिन आप भरोसा नहीं कर सकते उनमें अंतराल नहीं है।

यदि आपको स्तंभ के मानों की कोई आवश्यकता नहीं है, तो आपको स्वयं मूल्यों का प्रबंधन करने की आवश्यकता होगी, या तो ट्रिगर के माध्यम से व्यावसायिक तर्क की एक और परत या DB में (ट्रिगर के साथ संभावित प्रदर्शन के मुद्दों से सावधान रहें), निश्चित रूप से यदि आप अपने स्वयं के रोल करते हैं आपको सभी संगामिति / रोलबैक / क्लीनअप-के-डिलीट / अन्य मुद्दों के साथ संघर्ष करना होगा जो डीबी इंजन अंतराल की अनुमति देकर काम करते हैं)।


क्या आप कुछ संदर्भ प्रदान कर सकते हैं जहां इस व्यवहार पर चर्चा की जा रही है?
प्रश्न

1
एसओ पर, और आम तौर पर इस मामले में काफी कुछ संदर्भ हैं। "पहचान अंतराल", "auto_increment अंतराल", और इसके बाद के लिए खोजें, और आपको बहुत चर्चा मिलनी चाहिए। खोज को और अधिक विशिष्ट बनाने के लिए आप अपना DBMS नाम जोड़ सकते हैं, हालाँकि यह एक सामान्य अवधारणा है, ताकि जब तक आप विस्तार से काम न करें तब तक कोई वास्तविक अंतर नहीं पड़ सकता है।
डेविड स्पिललेट

4
MySQL के विवरण देखें: InnoDB में AUTO_INCREMENT हैंडलिंग , जिसमें यह उल्लेख किया गया है: " थोक आवेषण" के लिए ऑटो-इन्क्रीमेंट वैल्यू में अंतराल ... लॉक मोड 1 या 2 के लिए, गैप लगातार बयानों के बीच हो सकता है क्योंकि थोक आवेषण की सटीक संख्या प्रत्येक विवरण के लिए आवश्यक ऑटो-इन्क्रीमेंट मान ज्ञात नहीं हो सकता है और ओवरस्टिमेशन संभव है। "
ypercube y

@ypercube, धन्यवाद, यह आपके लिए सबसे अधिक उपयोगी है।
प्रश्न ओवरफ्लो

इसके अलावा Bugs.mysql.com/bug.php?id=34696 देखें ।
trss
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.