मुझे विश्वास नहीं है कि एक सरल तरीका है जो नियमित अनुक्रम जितना आसान है, क्योंकि:
- एक अनुक्रम केवल एक नंबर स्ट्रीम (अगला मान, आदि) संग्रहीत करता है। आप प्रत्येक विभाजन के लिए एक चाहते हैं।
- अनुक्रमों में विशेष हैंडलिंग होती है जो वर्तमान लेनदेन को छोड़ देती है (दौड़ की स्थिति से बचने के लिए)। dblink जैसी तरकीबों का उपयोग किए बिना SQL या PL/pgSQL स्तर पर इसे दोहराना कठिन है।
- DEFAULT कॉलम प्रॉपर्टी एक साधारण एक्सप्रेशन या फ़ंक्शन कॉल जैसे
nextval('myseq')
का उपयोग कर सकती है; लेकिन यह फ़ंक्शन को सूचित करने के लिए अन्य स्तंभों को संदर्भित नहीं कर सकता है कि मान किस स्ट्रीम से आना चाहिए।
आप कुछ ऐसा बना सकते हैं जो काम करे, लेकिन आप शायद इसे आसान नहीं समझेंगे। उपरोक्त समस्याओं को बारी-बारी से संबोधित करना:
- सभी विभाजनों के लिए अगला मान संग्रहीत करने के लिए एक तालिका का उपयोग करें, एक स्कीमा के साथ जैसे
multiseq (partition_id, next_val)
। -
एक
multinextval(seq_table, partition_id)
लिखें फ़ंक्शन जो निम्न जैसा कुछ करता है:- वर्तमान लेनदेन पर स्वतंत्र एक नया लेनदेन बनाएं (ऐसा करने का एक तरीका dblink के माध्यम से है; मेरा मानना है कि कुछ अन्य सर्वर भाषाएं इसे अधिक आसानी से कर सकती हैं)।
seq_table
में उल्लिखित तालिका को लॉक करें ।- पंक्ति को अपडेट करें जहां पार्टीशन आईडी है
partition_id
, बढ़े हुए मान के साथ। (या यदि कोई मौजूदा पंक्ति नहीं है तो मान 2 के साथ एक नई पंक्ति डालें।) - उस लेन-देन को प्रतिबद्ध करें और पिछली संग्रहीत आईडी (या 1) लौटाएं।
-
अपनी प्रोजेक्ट टेबल पर एक इंसर्ट ट्रिगर बनाएं जो
multinextval('projects_table', NEW.Project_ID)
पर कॉल का उपयोग करता हो सम्मिलन के लिए।
मैंने खुद इस पूरी योजना का उपयोग नहीं किया है, लेकिन मैंने व्यक्तिगत रूप से प्रत्येक चरण के समान कुछ करने की कोशिश की है। multinextval
. के उदाहरण यदि आप यह प्रयास करना चाहते हैं तो फ़ंक्शन और ट्रिगर प्रदान किया जा सकता है...