2008-12-12 12 views
21

इस तरह एक ऑटो-वृद्धि कॉलम के साथ एक साधारण तालिका पर विचार करें:क्या होता है जब एक ऑटो-वृद्धिशील कॉलम समाप्त हो जाता है?

CREATE TABLE foo 
(
    `fooid` bigint unsigned NOT NULL auto_increment, 
    ....snipped.... other columns 
    PRIMARY KEY (`fooid`) 
) 
ENGINE=InnoDB AUTO_INCREMENT=10 

कोई इसे फिर से डिज़ाइन कैसे करता है ताकि हम अधिकतम बिटकैट टाइप को अधिकतम न करें? हस्ताक्षरित रेंज 0 से 18446744073709551615 है। मुझे नहीं पता कि 18446744073709551615 तक पहुंचने में कितना समय लगेगा, लेकिन वाई 2 के समस्या की तरह, मैं इसके लिए तैयार होना चाहता हूं।

उत्तर

55

आप एक पंक्ति हर मिलीसेकंड सम्मिलित मान लीजिए।

18446744073709551615 millseconds = 18446744073709552 सेकंड = 307445734561826 मिनट = 5124095576030 घंटे = 213,503,982,335 दिन = 584,942,417 साल

तो यह वास्तव में Y2K समस्या की तरह नहीं है

आप एक मिलियन डाल सकता है पंक्तियों प्रति मिलीसेकंड और अभी भी 500 से अधिक वर्षों के लिए ठीक है।

दूसरे शब्दों में: इसके बारे में चिंता मत करो।

+1

ठीक है। मुझे नहीं लगता कि मेरा ऐप उस लंबे => 500 साल तक चलेगा। – ashitaka

+2

इसी प्रकार, यदि आप केवल एक बार एक दूसरे डालें, अपने अनुप्रयोग एक 32-बिट पर हस्ताक्षर किए पूर्णांक के साथ 68 साल के लिए चलाए जा सकें। प्रति रिकॉर्ड 4-बाइट बचाएं और यदि आप कर सकते हैं तो 32-बिट int का उपयोग करें। – jmucchiello

+0

मैं दूसरा हूं। ऐसी चीजें हैं जिन्हें डेटाबेस बनाने के दौरान अधिक सावधानी की आवश्यकता होती है। – Tomalak

18

आप जिस SQL mode का उपयोग कर रहे हैं उसके आधार पर, MySQL दो चीजों में से एक करता है जब AUTO_INCREMENT संख्यात्मक कॉलम का मान सीमा से बाहर हो जाता है। आपको किसी भी मामले में त्रुटि मिलती है, लेकिन विभिन्न कारणों से।

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

MySQL said: 

#1062 - Duplicate entry '65535' for key 1 

BIGINT उदाहरण के लिए यहाँ, "65535" से बदलें 18 क्विंटलियन, हालांकि यह संभावना नहीं है कि यह त्रुटि कभी भी उत्पादन डेटाबेस पर हुई है।

लेकिन TINYINT और SMALLINT रों यह बहुत आसानी से हो सकता है यदि आप किसी एप्लिकेशन के जीवनकाल में संभव कुंजी मान (INSERT रों की संख्या) बहुत मूल्यवान समझना के साथ। कल्पना करें कि आप अपने कोड में बदलाव कर रहे हैं और परीक्षण कर रहे हैं कि आपका डेटा सही तरीके से डाला जा रहा है। अचानक आपका आवेदन उपर्युक्त त्रुटि के साथ काम करता है। आप ज्ञात अच्छे कोड में परिवर्तन वापस रोल करते हैं, लेकिन त्रुटि दूर नहीं जाएगी ... बहुत निराशाजनक।

2

MySQL के बारे में नहीं पता, लेकिन Postgresql के मामले में, आप निर्दिष्ट कर सकते हैं कि अनुक्रम एक साइक्ल/कोई साइक्ल है या नहीं। यदि एक CYCLE विकल्प के साथ बनाया गया है, तो यह फिर से 1 (या minvalue) पर वापस आ जाएगा और डुप्लिकेट कुंजी के लिए त्रुटि फेंक देगा।

+2

MySQL में उपलब्ध नहीं है। –

संबंधित मुद्दे