2012-07-04 12 views
5

क्या MySQL में सभी तालिकाओं के लिए एक उचित देशी गैर-वर्कअराउंड ऑटो वृद्धि संभावना है? मेरा मतलब है, प्रति टेबल केवल ऑटो इंक नहीं, मेरा मतलब डेटाबेस में प्रत्येक नई पंक्ति के लिए एक संख्या गिनती है?क्या mySQL में पूर्ण डेटाबेस (प्रत्येक तालिका नहीं!) पर ऑटो वृद्धि हुई है?

मैंने इसे पेशेवर ऑरैकल (?) सेट अप पर देखा है। मुख्य लाभ यह है कि आपके पास सभी तालिकाओं में सभी पंक्तियों/तत्वों के लिए अद्वितीय आईडी नहीं है, न केवल प्रति तालिका।

+2

यदि आप विशिष्टता की गारंटी देना चाहते हैं, तो आप MySQL के ['UUID_SHORT()'] (http://dev.mysql.com/doc/en/miscellaneous-functions.html#function_uuid-short) फ़ंक्शन का उपयोग कर सकते हैं। – eggyal

+0

MySQL में अनुक्रम नहीं हैं (जैसा कि अधिकांश अन्य डीबीएमएस करते हैं)। आपको अपना खुद का समाधान रोल करने की जरूरत है। –

+0

मुझे मूल तरीके से पता नहीं है। लेकिन हो सकता है कि आप एक सम्मिलित ट्रिगर लिख सकें जो उच्चतम अनुक्रमणिका के लिए सभी तालिकाओं की खोज करता है और उस मान को वापस कर देता है। कम से कम सिद्धांत में, ईमानदारी से मुझे यकीन नहीं है कि यह MySQL में संभव है। – acme

उत्तर

6

पोस्टग्रेएसक्यूएल CREATE SEQUENCE seq_name के साथ इस तरह स्थापित किया जा सकता है और प्रत्येक सम्मिलन पर nextval(seq_name) का उपयोग कर सकता है।

MySQL के लिए मूल समर्थन नहीं है, तो आप उस कॉलम पर केवल एक कॉलम और AUTO_INCREMENT के साथ एक तालिका बनाकर PostgreSQL SEQUENCE के व्यवहार को अनुकरण कर सकते हैं।

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

इसे प्राप्त करने का एक और तरीका एक कॉलम संख्या AUTO_INCREMENT के साथ एक तालिका बनाना और वर्तमान अधिकतम मान रखने वाली केवल एक पंक्ति है।

हर बार जब आप आप UPDATE seq_table SET seq_column = seq_colum+1; एक वेतन वृद्धि अद्यतन परमाणु में ही है पर अमल बढ़ाने के लिए की जरूरत है, लेकिन आप भी जो दो बयान करता है और वे जब तक आप उन्हें चारों ओर एक लेन-देन और एक उचित अलगाव सेट एक साथ परमाणु नहीं हैं बाद में मूल्य पढ़ने की जरूरत है स्तर। यह दृष्टिकोण अंतरिक्ष बचाता है लेकिन लॉकिंग प्रश्न भी उत्पन्न करता है।

INSERT की कोशिश कर रहे एकाधिक थ्रेडों को दूसरों को अपडेट करने और नए मान को पढ़ने में सक्षम होने से पहले seq_table को अपडेट करने के लिए इंतजार करना होगा।

इसके अलावा, आप एक उपयुक्त ISOLATION LEVEL के साथ एक सौदे में UPDATE और SELECTseq_table पर लपेट के लिए मूल्य है कि कुछ अन्य धागे के बाद आप इसे वृद्धि वृद्धि पढ़ने से बचने के लिए होगा।

इसका मतलब है कि INSERTS एक लेनदेन संबंधी मुद्दा बन गया है लेकिन आम तौर पर वे नहीं हैं, इसलिए मैं दूसरे दृष्टिकोण की अनुशंसा नहीं करता।

+0

पहले दृष्टिकोण में एकाधिक पंक्तियों से छुटकारा पाने के लिए, हम पहले सभी पंक्तियों को हटा सकते हैं और फिर सम्मिलित कर सकते हैं। – palindrom

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