जब तालिका में एक क्षेत्र अधिकतम हस्ताक्षरित या अहस्ताक्षरित 32 बिट पूर्णांक के पास जाता है तो क्या करें?


14

किसी भी दिए गए डेटाबेस में जो उपयोगकर्ता के रिकॉर्ड को एक अद्वितीय ऑटो-इन्क्रिमेंट फ़ील्ड (उदाहरण के लिए, अंतर-उपयोगकर्ता संदेश) के रूप में रखता है ... समय आने पर क्या करना है और यह अधिकतम हस्ताक्षरित या अहस्ताक्षरित संख्या तक पहुंचता है वर्तमान डेटाटाइप के? (एक 32-बिट INT)? मैं अनुमान लगा रहा हूं कि जब अगली प्रविष्टि के लिए (२ )३२) -1 नंबर को असाइन करने का प्रयास किया जाएगा तो डेटाबेस सर्वर ओवरफ्लो हो जाएगा, इसलिए, ऐसा होने से कैसे बचें (डेटाटाइप को बदले बिना, प्रश्न के लिए) और रिकॉर्ड जोड़ते रहें? तुम क्या करोगे?

मैं INT का उपयोग क्यों करूंगा, उदाहरण के लिए, VARCHARS?

कई दिन हो गए हैं जब मैंने खुद से यह काल्पनिक सवाल पूछा है और मैं जानना चाहूंगा कि एक पेशेवर क्या करेगा।

जवाबों:


12

आप आम तौर पर varchars के बजाय पूर्णांक का उपयोग करते हैं क्योंकि वे कम जगह का उपभोग करते हैं, अच्छी तरह से समझते हैं कि छँटाई पैटर्न इंडेक्स आदि के लिए तेज़ हैं। इंटीग्रर्स सीपीयू के प्राकृतिक डेटा प्रकार हैं, और इसलिए प्रदर्शन आम तौर पर इष्टतम है। आमतौर पर एक पूर्णांक 4 बाइट्स होता है, जो एक (गैर-यूनिकोड) वर्चर में सिर्फ 4 वर्णों के बराबर होता है।

यदि आप एक INT प्रकार के साथ अंतरिक्ष से बाहर भागने के बारे में चिंतित थे, तो BIGINT आज़माएं, जो आपको 8-बाइट नंबर देता है। इस पर सीमा बहुत बड़ी है, और आप रिकॉर्ड की सीमा तक पहुँचने से पहले शायद डिस्क स्थान से बाहर भाग लेंगे :-) BIGINT का प्रदर्शन भी बहुत अच्छा होने वाला है, विशेष रूप से कई सर्वर अब 64-बिट भी हैं ।

जब आप INT में भाग लेते हैं तो क्या होता है, इस बारे में आपके प्रश्न के पहले भाग का उत्तर सरल नहीं है, विशेषकर जैसा कि आपने डेटाटाइप को BIGINT में बदले बिना कहा था। मूल रूप से बहुत कुछ ऐसा नहीं है जो आप कर सकते हैं, और आप जो करने में सक्षम हो सकते हैं वह आपके डेटाबेस में डेटा की प्रकृति से बहुत सीमित है। इस डेटा के लिए विदेशी रिकॉर्ड क्या हैं? क्या आपको अभी भी उस तालिका और संबंधित रिकॉर्ड में सभी डेटा की आवश्यकता है? इस धारणा पर कि आप बहुत से प्रारंभिक डेटा (और उसके संबंधित डेटा) को संग्रहीत कर सकते हैं, तो केवल एक चीज जो मैं सुझा सकता हूं वह है डेटा को तालिका से बाहर ले जाना (पहले 1 से X मिलियन रिकॉर्ड्स कहना), और फिर पहचान पत्र को रीसेट करना 1. सभी प्रकार के कारण हैं, हालांकि मैं इसकी सिफारिश नहीं करूंगा - उदाहरण के लिए कोड के कई बिट्स हैं जो मैंने देखे हैं कि एक आईडी फ़ील्ड के अधिकतम मूल्य की जाँच करें, यह देखने के लिए कि अभी क्या जोड़ा गया है, और यह काम नहीं करेगा (और नहीं किया जाना चाहिए)। इसके अलावा, लोग मानते हैं कि रिकॉर्ड N को N + 1 से पहले बनाया गया था। कोई आसान जवाब नहीं मुझे लगता है।

अंत में, मुझे MySQL के बारे में पता नहीं है, लेकिन यदि आप सीमा तक पहुँच गए हैं तो SQL सर्वर ओवरफ़्लो त्रुटि देगा।


1
मैं इस तरह के एक विस्तृत जवाब से प्रसन्न हूं। VARCHAR, INT और BIGINT डील की व्याख्या के लिए धन्यवाद। चूंकि प्रश्न काल्पनिक है, मुझे आश्चर्य है कि यदि BIGINT की सीमा पूरी हो जाती है तो क्या होगा। प्रश्न मैं फेसबुक द्वारा INT के उपयोग और सीमा तक पहुंचने के बारे में देखा गया एक पोस्ट द्वारा उठाया गया था, और मैं इसे पूरी तरह से संभव देखता हूं। संग्रह कार्य करेगा, या सशर्त विवरण के साथ एक दूसरी तालिका (जो, जैसा कि आपने कहा था, लिपियों को अपडेट करने की आवश्यकता होगी, भी, और यह बहुत जटिल होगा)। कुल मिलाकर, शानदार जवाब। मैं लिए गए समय की सराहना करता हूं।
एयरोक्रॉस

9

एक अनदेखी बात यह है कि कई लोग 1 पर ऑटो नंबर या पहचान शुरू करते हैं और इस तरह संभव सीमा का आधा हिस्सा तुरंत (हस्ताक्षर के लिए) खो देते हैं

आप बस इस मामले में -1, वेतन वृद्धि -1 शुरू करने के लिए संख्या को फिर से परिभाषित करेंगे।

यकीनन, अगर आपको कभी भी अपना पहचान पत्र भरने की उम्मीद है तो आपको शुरुआत में इसका एक व्यापक प्रारूप तैयार करना चाहिए।

इस हालिया प्रश्न को देखें SO: SQL Server 2008: क्या हुआ यदि पहचान int के अधिकतम मान को ओवरस्टेप करती है?


यह तर्कसंगत है कि मैं एक व्यापक डेटा टाइप का उपयोग करूँगा (एक तालिका के लिए जो डेटा की मात्रा कितनी होगी), लेकिन चूंकि यह एक काल्पनिक प्रश्न था, इसलिए मुझे कुछ जानकारी चाहिए थी। यदि यह हस्ताक्षरित है, तो वह काम कर सकता है (लेकिन मैं नकारात्मक संख्याओं, IMHO के साथ एक प्राथमिक कुंजी रखने वाला थोड़ा अजीब होगा) और मुझे लगता है कि यह बहुत चालाक है। यह DBA को सकारात्मक डेटा को संग्रहीत करने और फिर से शुरू करने के लिए समय देगा। यदि अहस्ताक्षरित, अच्छी तरह से ... समस्याएं।
एयरोक्रॉस

वैकल्पिक रूप से -1 से -1 वेतन वृद्धि का उपयोग करते हुए, (-2147483648) पर शुरू करें और 1 से बढ़ाएँ। लेकिन हाँ, जब आप INT_MAX को पार कर लेते हैं तो आप बहुत अच्छी तरह से hosed हो जाते हैं और डिजाइन को फिर से तैयार करने की जरूरत होती है, और पुराने सूचकांक को हटाने की आवश्यकता होती है। एक नए बड़े के साथ। और अगर आप अहस्ताक्षरित पास करते हैं तो मैं आपकी टीम पर काम करना चाहता हूं;)
jcolebrand at

PostgreSQL आईडी संख्या उत्पन्न करने के लिए दृश्यों का उपयोग करता है; क्रीक सक्सेस स्टेटमेंट आपको CYCLE को निर्दिष्ट करने देता है, जो अधिकतम मूल्य तक पहुंचने पर बस चारों ओर लपेट देगा। (या न्यूनतम मान, यदि आप दूसरी दिशा में जा रहे हैं।) CYCLE विकल्प अब SQL मानकों में है। (कम से कम 2003 के बाद से)
माइक शेरिल 'कैट रिकॉल'

4

अतिप्रवाह? Haha। पहले यह जान लें कि अमरता कैसे प्राप्त की जाती है। INT UNSIGNED (4 बिलियन) तक पहुँचने के लिए पर्याप्त कठिन है। प्रति वर्ष 100 INSERT एक साल में INT को ओवरफ्लो करने के करीब आ जाएंगे। BIGINT को कई अरब साल लगेंगे।

ठीक करने के लिए: वैकल्पिक टेबल मोड मोडी कोलम आईडी के आकार में पूरी तरह से नॉटऑनलाइन नहीं है; लेकिन इसमें कई घंटे लगेंगे क्योंकि यह टेबल पर कॉपी हो जाएगी (जिसमें करीब 4 बिलियन पंक्तियां हैं, दाईं ओर?) और सभी सेकेंडरी इंडेक्स को फिर से बनाना। आगे की योजना।

आम तौर पर जब आप किसी क्षेत्र के लिए बहुत बड़ी संख्या को स्टोर करने की कोशिश करते हैं (जैसे, एक टिन में संयुक्त रूप से 999), तो यह चुपचाप क्षेत्र के लिए अधिकतम कैप करेगा (इस मामले में 255)। एक "चेतावनी" हो सकती है, लेकिन अधिकांश लोग चेतावनियों को जांचने की जहमत नहीं उठाते हैं। यदि यह एक अद्वितीय क्षेत्र है, या कोई कुंजी कुंजियाँ हैं, तो आपको अधिक गंभीर त्रुटि मिल सकती है।

CHAR या VARCHAR चुपचाप उपलब्ध स्थान को काट दिया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.