2011-12-25 9 views
7

मान लें मैं मेज मिल गया है: एक अपाचे/पीएचपी वेबसाइट के माध्यम सेMySQL: क्या एक AutO_INCREMENT आदेश से बाहर मूल्य उत्पन्न कर सकता है?

CREATE TABLE test (
    ID INT AUTO_INCREMENT PRIMARY KEY, 
    InsertTime DATETIME 
) ENGINE = InnoDB; 

और,, वेब अनुरोध के जवाब के रूप में, मैं ऐसा करना जारी रखें:

INSERT INTO test (InsertTime) values (NOW()); 

यह ग्रहण करने के लिए सुरक्षित है कि अगर row1.ID > row2.ID तो row1.InsertTime >= row2.InsertTime? या शायद कारकों के कुछ दुर्भाग्यपूर्ण संयोजन के माध्यम से (एक संगत वातावरण में बहु-सीपीयू सर्वर सही संरेखण आदि में बृहस्पति के चंद्रमाओं के साथ) यह असफल हो सकता है?

नोट: मुझे कोई समस्या नहीं है। मैं सॉफ़्टवेयर का एक नया टुकड़ा लिख ​​रहा हूं और सोच रहा हूं कि क्या मैं ID द्वारा क्रमबद्ध करने के लिए क्रमबद्ध करने पर भरोसा कर सकता हूं (दिनांक NOW() भी उस कॉलम में डाला जाएगा)।

+1

यह एक समस्या प्रतीत नहीं होता है, बल्कि एक चर्चा है -> एसई प्रोग्रामर के लिए कुछ और? और वह रिकॉर्ड करने के लिए, मैं नहीं देखता कि यह कैसे असफल हो सकता है। –

+2

@saratis - यह नहीं देखते कि यह एक चर्चा कैसे है? यह एक विशिष्ट सवाल है। या तो यह 100% गारंटीकृत काम करता है या यह नहीं करता है। –

+0

हालांकि मुझे लगता है कि यहां 2 अलग-अलग प्रश्न हैं। "क्या कोई आईडी कभी प्रविष्टि आदेश से उत्पन्न हो सकता है" और "क्या आदेश कभी भी डेटाटाइम कॉलम के क्रम से मेल खाने में विफल हो सकता है?" –

उत्तर

2

मुझे लगता है कि अधिकतर समस्याएं कॉल से अब (AUTO_INCREMENT) के कॉल पर आती हैं। मुझे लगता है कि ज्यादातर कंप्यूटर प्रिंट पर कुछ कंप्यूटर अब() तारीख से बाहर हैं! यह आमतौर पर या तो एक sysadmin घड़ी बदल गया है, या क्योंकि एनटीपी घड़ी बदल दिया।

+0

वाह, मैंने एनटीपी के बारे में सोचा नहीं था। यह अब इतना स्पष्ट है! और इसका यह भी अर्थ है कि मेरी आईडी को सॉर्ट करना न केवल संभव है - इसकी दृढ़ता से अनुशंसा की जाती है! चूंकि यह सुनिश्चित करने का एकमात्र तरीका है कि रिकॉर्ड्स उसी क्रम में पुनर्प्राप्त किए जाते हैं जिन्हें वे डाला गया था। –

2

मुझे लगता है कि साल में एक बार डीएसटी की वजह से आपके पास कुछ असंगतता होगी (निश्चित रूप से, यह सर्वर सेटिंग्स पर निर्भर करता है)। इसके अलावा मैं नहीं देखता कि यह क्यों विफल हो सकता है।

+0

जब तक आप डेट-तुलना की बजाय स्ट्रिंग-तुलना नहीं कर रहे हैं, डीएसटी डेट ऑर्डर में बदलाव नहीं करेगा। टाइमस्टैम्प को हुड के नीचे यूटीसी के रूप में संग्रहीत किया जाता है। MySQL जानता है कि यूटीसी -7 में 8:00 बजे यूटीसी -8 में 7:01 बजे से छोटा है। –

+0

उपरोक्त उदाहरण में मैं MySQL के 'डेटाटाइम' प्रकार का उपयोग करता हूं जो यूटीसी या किसी भी प्रकार की टाइमस्टैम्प का उपयोग नहीं करता है। इसके बजाय यह तारीख को स्ट्रिंग के रूप में संग्रहीत करता है (ठीक है, लगभग)। इस तरह आप उन सभी अवैध तिथियों को प्राप्त कर सकते हैं जैसे '00-00-0000'। यह टाइमज़ोन के बारे में कुछ भी नहीं कहता है, इसलिए मुझे खुद का ट्रैक रखना है। सब कुछ, मुझे लगता है कि TIMESTAMP एक बेहतर विकल्प होगा। –

+0

ओह, और इसका भी अर्थ है कि डीएसटी के कारण संक्रमण के दौरान समय भ्रम हो सकता है। उस डेटाटाइप से बचने का एक और कारण। –

0

यदि कोई मैन्युअल रूप से तालिका पर auto_increment रीसेट करता है तो यह संभव है।

+0

यह सामान्य ऑपरेशन का हिस्सा नहीं है। आप 'अब()' के बजाय मैन्युअल दिनांक भी दर्ज कर सकते हैं। जाहिर है, अगर आप ऐसा कुछ करते हैं, तो सभी दांव बंद हैं। –

1

जितना अच्छा मैं बता सकता हूं, ऑटोइनक्रिकमेंट आईडी कभी भी गलत क्रम में रिकॉर्ड वापस करने में विफल नहीं होगी। हालांकि, एक अन्य मामला है जिसे आपको आईडी द्वारा ऑर्डर करने के बारे में पता होना चाहिए।

यदि आपका ग्राहक कभी भी बाद में डालने के लिए रिकॉर्ड पर रहता है, तो जब रिकॉर्ड पढ़े जाते हैं, तो उन्हें बनाए गए उसी क्रम में नहीं पढ़ा जाएगा। मैंने कई बार इसमें भाग लिया है, उदाहरण के लिए, जब मोबाइल ऐप्स के लिए क्लाइंट का निर्माण होता है जिसमें नेटवर्क पहुंच में अंतर होता है।

+0

दिलचस्प, हालांकि वास्तव में मेरा मामला नहीं है। वैसे भी अपवित्र के योग्य। :) –

0

हां, auto_increment कॉलम हटाएं, फिर एक नया पुन: बनाएं।

+1

[ब्लॉकहेड के उत्तर] पर मेरी टिप्पणी देखें (http://stackoverflow.com/a/8630149/41360)। –

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