आप जो चाहते हैं उसे करने के लिए मुझे किसी सुरक्षित, कुशल तरीके की जानकारी नहीं है। आपको वास्तव में यह चुनना चाहिए कि आप कुंजियों को स्वयं परिभाषित करना चाहते हैं या जेनरेट की गई कुंजियों का उपयोग करना चाहते हैं और एक रणनीति या दूसरे से चिपके रहना चाहते हैं।
यदि आपको भयानक संगामिति से कोई आपत्ति नहीं है, तो आप LOCK TABLE thetable
, अपना काम करो, setval
तालिका के पहचानकर्ता अनुक्रम को आपके द्वारा सम्मिलित किए जाने के बाद अगले निःशुल्क मान पर, और commit
ताला मुक्त करने के लिए। हालाँकि, यह अभी भी उन ऐप्स के साथ समस्याएँ पैदा करेगा जो स्पष्ट रूप से nextval
. कहते हैं (कई ORM की तरह) डेटाबेस को ?INSERT
से हटाकर मान को परिभाषित करने देने के बजाय कॉलम सूची या स्पष्ट रूप से इसे DEFAULT
. के रूप में नामित करना ।
अन्यथा आप अपना कोड (या पीएल/पीजीएसक्यूएल हेल्पर फ़ंक्शन) प्राप्त कर सकते हैं, एक रिट्री लूप में सम्मिलित करें जो कुंजी को बढ़ाता है और अखंडता त्रुटि मिलने पर फिर से प्रयास करता है। यह रणनीति काम नहीं करेगी यदि आपको प्रति लेनदेन केवल एक प्रविष्टि से अधिक करने की आवश्यकता है। इसके अलावा SERIALIZABLE
. में अलगाव मोड मुझे नहीं लगता कि आप इसे पीएल/पीजीएसक्यूएल के साथ कर सकते हैं, आपको क्रमांकन विफलताओं को संभालने के लिए क्लाइंट-साइड रिट्री लूप का उपयोग करना होगा।
यह एक भयानक विचार है। या तो एप्लिकेशन परिभाषित कुंजियों का लगातार उपयोग करें, या डेटाबेस-परिभाषित कुंजियों का लगातार उपयोग करें। दोनों को मिक्स न करें।