2013-01-09 12 views
5

मेरे पास एक टेबल है जिसमें AUTO INCREMENT के साथ कॉलम है। नई पंक्ति डालने पर मुझे इस कॉलम के मान को पुनर्प्राप्त करना होगा (मुझे नई पंक्ति के मूल्य की आवश्यकता है)। मैंने इसके बारे में बहुत कुछ पढ़ा है और विभिन्न समाधान पाए हैं, एक SELECT LAST_INSERT_ID() का उपयोग करना है। मैंने इसके बारे में कई अलग-अलग चीजें सुनी हैं। क्या मैं इसका उपयोग नहीं कर सकता या नहीं? मुझे चिंता है कि SELECT LAST_INSERT_ID() पर कॉल करने में सक्षम होने से पहले एक और कनेक्शन एक नई पंक्ति डाल सकता है, और इसलिए गलत आईडी प्राप्त करें।डालने वाली पंक्ति की आईडी को पुनः प्राप्त करने के लिए MYSQL LAST_INSERT_ID() का उपयोग करना?

समेकित करने के लिए, क्या यह SELECT LAST_INSERT_ID() का उपयोग करने के लिए सुरक्षित है? यदि नहीं, तो मैं अंतिम प्रविष्टि आईडी को सुरक्षित तरीके से कैसे प्राप्त कर सकता हूं?

+0

अंतिम डालने आईडी का उपयोग कर सकते हैं वर्तमान कनेक्शन के लिए उत्पन्न पिछले आईडी लौटना चाहिए प्रयास करें। अन्य कनेक्शन के बारे में चिंता करने की ज़रूरत नहीं है। –

+0

इसे देखें: http: //dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id –

+2

यदि आपके पास स्वचालित कनेक्शन पूलिंग है, तो एक और कॉल चलाना अलग-अलग हो सकता है कनेक्शन। यदि आपके पास यह नहीं है, तो आप सुरक्षित हैं। –

उत्तर

12

मुझे नहीं लगता कि आपको उस मामले के बारे में चिंता करने की ज़रूरत है जिसका आप यहां उल्लेख कर रहे हैं।

Mysql प्रलेखन से :
आईडी उत्पन्न हुए उस एक प्रति कनेक्शन आधार पर सर्वर में बनाए रखा है। इसका अर्थ यह है कि किसी दिए गए क्लाइंट को फ़ंक्शन द्वारा लौटाया गया मान पहले AUTO_INCREMENT मान है जो उस क्लाइंट द्वारा AUTO_INCREMENT कॉलम को प्रभावित करने वाले सबसे हालिया कथन के लिए जेनरेट किया गया है। यह मान अन्य ग्राहकों द्वारा प्रभावित नहीं किया जा सकता है, भले ही वे AUTO_INCREMENT स्वयं के मूल्य उत्पन्न करते हैं। यह व्यवहार सुनिश्चित करता है कि प्रत्येक ग्राहक अन्य ग्राहकों की गतिविधि के लिए चिंता के बिना अपनी खुद की आईडी पुनर्प्राप्त कर सके, और ताले या लेन-देन की आवश्यकता के बिना।

विस्तृत जानकारी के लिए, का उल्लेख this

हालांकि, मैं दूसरों से पढ़ने के लिए ही वे अलग राय है अच्छा लगेगा।

0

यदि आपके लिए तालिका की अंतिम आईडी रखना महत्वपूर्ण है, तो आप तालिका के लिए तालिका को लॉक कर सकते हैं, फिर SELECT MAX(id) FROM table_name बनाएं और फिर तालिका अनलॉक करें।

0

उत्पन्न आईडी प्रति कनेक्शन आधार पर है, इसलिए आपको कोई समस्या नहीं होनी चाहिए! This पोस्ट अधिक जानकारी में चला जाता है।

0

हाँ, आधिकारिक दस्तावेज के अनुसार, यह सुरक्षित है:

आईडी उत्पन्न हुए उस एक प्रति कनेक्शन आधार पर सर्वर में बनाए रखा है। इसका अर्थ यह है कि किसी दिए गए क्लाइंट को फ़ंक्शन द्वारा लौटाया गया मान उस क्लाइंट द्वारा AUTO_INCREMENT कॉलम को प्रभावित करने वाले सबसे हालिया कथन के लिए जेनरेट किया गया पहला AUTO_INCREMENT मान है। यह मान अन्य ग्राहकों द्वारा प्रभावित नहीं किया जा सकता है, भले ही वे अपने स्वयं के ऑटोमेशन क्रेडिट मूल्य उत्पन्न करते हैं। यह व्यवहार सुनिश्चित करता है कि प्रत्येक ग्राहक अन्य ग्राहकों की गतिविधि के लिए चिंता के बिना अपनी खुद की आईडी पुनर्प्राप्त कर सके, और ताले या लेन-देन की आवश्यकता के बिना।

से लिया MYSQL Documentation 12.13. Information Functions

0

आप पीडीओ उपयोग कर रहे हैं, PDO::lastInsertId.

का उपयोग करें और अगर आप mysql का उपयोग कर रहे, mysqli::$insert_id.

का उपयोग करें और हाँ यह AI उपयोग करने के लिए यह सुरक्षित है वह पोस्ट जो यह कहता है: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

और सेलेक का उपयोग करने के बजाय टी बयान सीधे, preparedStatement.

उपयोग करने के लिए इसके अलावा, आप Lock

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