2009-02-24 8 views

उत्तर

17

भले ही आप अगले उपलब्ध प्राथमिक कुंजी मान से पूछ सकें, यह आपकी मदद नहीं करेगा। जब तक आप तालिका को लॉक नहीं करते हैं, तब तक आप उस मान का उपयोग नहीं कर सकते हैं इससे पहले कि कुछ अन्य डेटाबेस क्लाइंट इसे अपने सम्मिलित करने के लिए पकड़ सकें।

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

"आपके सत्र के दौरान" भाग महत्वपूर्ण है क्योंकि यह आपके सत्र को अन्य ग्राहकों द्वारा समवर्ती रूप से किए जाने वाले किसी भी आवेषण से ढालता है। वे प्रमुख मान उत्पन्न कर सकते हैं और आपका सत्र उसी मूल्य की रिपोर्ट करना जारी रखेगा यह हाल ही में डाला गया।

@ स्टुअर्ट चाइल्ड्स supposes कि MySQL MAX(column_name)+1 के साथ अगली आईडी उत्पन्न करता है लेकिन यह गलत है। मान लें कि आप एक पंक्ति डालते हैं और एक आईडी मान उत्पन्न होता है। लेकिन आप उस पंक्ति को रोलबैक करते हैं, या बाद में DELETE उस पंक्ति को रोलबैक करते हैं। अगली बार जब आप डालेंगे, MySQL एक नया नया आईडी मान उत्पन्न करेगा। इसलिए आईडी मान किसी भी ग्राहक द्वारा उत्पन्न अंतिम आईडी मान से अधिक है, भले ही तालिका में कौन सी पंक्तियां संग्रहीत हों।

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

स्वत: जेनरेट किए गए प्राथमिक कुंजी मानों का पुन: उपयोग नहीं किया जाता है या एक से अधिक सत्रों में आवंटित नहीं किया जाता है, भले ही आपने अभी तक अपना सम्मिलित नहीं किया है, या यदि आप सम्मिलित रोलबैक करते हैं, या यदि आप पंक्ति को हटाते हैं।

+0

आह, ज्ञान की संपत्ति। –

+0

वाह, इस तरह के विस्तृत स्पष्टीकरण के लिए धन्यवाद धन्यवाद। – user20955

-1

मुझे लगता है कि आपको कुछ custom SQL निष्पादित करना होगा। आपको आवश्यक एसक्यूएल डीबी विशिष्ट होगा। जहां तक ​​मुझे पता है, MySQL में ऐसा करने का कोई विश्वसनीय तरीका नहीं है। आप अंतिम सम्मिलित आईडी प्राप्त कर सकते हैं लेकिन यह सत्र विशिष्ट है (यानी आप अपने डीबी सत्र में डाले गए अंतिम रिकॉर्ड की आईडी प्राप्त कर सकते हैं लेकिन आपके बाद के किसी अन्य सत्र के लिए अंतिम आईडी नहीं)। हालांकि (और अगर कोई गलत है तो कोई मुझे सही करता है), MySQL अगले आईडी को MAX (column_name) + 1 के साथ उत्पन्न करता है ताकि आप वही कर सकें।

PostgreSQL इसे sequence manipulation functions के साथ बहुत आसान बनाता है।

संपादित करें:

बाहर कर देता है मैं एक multi-column key जो हैं मैक्स (स्तंभ) +1 के साथ उत्पन्न भीतर AUTO_INCREMENT स्तंभों की सोच रहा था। हालांकि, बिंदु अभी भी खड़ा है कि अगली आईडी से पहले इसे पुनर्प्राप्त करने का कोई तरीका नहीं है, यह एक डालने से उत्पन्न होता है, जो मूल प्रश्न था।

+0

नहीं है, आईडी मैक्स (स्तंभ) +1 नहीं है। –

+0

हाँ, आप सही हैं। मुझे जांच करनी चाहिए क्योंकि ऐसा करने के लिए किसी भी बहु-उपयोगकर्ता डीबी के लिए यह सुंदर ब्राइंडेड होगा। –

0

मेरे पास यही सवाल था क्योंकि मैं एक तत्व को डुप्लिकेट कर रहा था और मैं इसे अपने पीके को एक नए में बदलना चाहता था ताकि इसे सम्मिलित किया जा सके।

import copy 
objectCopy=copy.copy(object) 
objectCopy.pk=None 
objectCopy.save() 

मेरा मतलब है, save() आप के लिए यह होता है, यही कारण है कि आप इसे मैन्युअल रूप से करना चाहते हैं, तो:

मेरे समाधान इस प्रकार थी?

-1

this स्निपेट निश्चित रूप से आपकी सहायता करेगा।

2

उपयोग करना Django और MySQL

next_id = Table.objects.filter (id__gt = current_id) [0] .id

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