2010-08-28 12 views
5

क्या पोस्टग्रेएसक्यूएल में विभाजित अनुक्रम बनाने के लिए एक सरल (यानी गैर-हैकी) और दौड़-स्थिति मुक्त तरीका है। उदाहरण:PostgreSQL विभाजन अनुक्रम कैसे बनाएं?

अंक में एक सामान्य अनुक्रम का उपयोग करना:

| Project_ID | Issue | 
| 1   | 1  | 
| 1   | 2  | 
| 2   | 3  | 
| 2   | 4  | 

अंक में एक विभाजित अनुक्रम का उपयोग करना:

| Project_ID | Issue | 
| 1   | 1  | 
| 1   | 2  | 
| 2   | 1  | 
| 2   | 2  | 
+0

मुझे यह जानकर खुशी होगी कि इस समस्या का कोई शानदार समाधान है या नहीं। यहां समाधान: http://stackoverflow.com/questions/4672629/postgresql-company-id-based-sequence खराब नहीं है, लेकिन क्या यह लेनदेन-सुरक्षित होगा? – Atorian

उत्तर

1

मैं नहीं मानता कि वहाँ एक आसान तरीका नियमित दृश्यों के रूप में के रूप में आसान है , क्योंकि:

  1. एक अनुक्रम केवल एक नंबर स्ट्रीम (अगला मान, आदि) स्टोर करता है। आप प्रत्येक विभाजन के लिए एक चाहते हैं।
  2. अनुक्रमों में विशेष हैंडलिंग है जो वर्तमान लेनदेन को छोड़ देता है (दौड़ की स्थिति से बचने के लिए)। एसबीएल या पीएल/पीजीएसक्यूएल स्तर पर dblink की तरह चाल का उपयोग किए बिना इसे दोहराना मुश्किल है।
  3. DEFAULT कॉलम संपत्ति एक साधारण अभिव्यक्ति या nextval('myseq') जैसे फ़ंक्शन कॉल का उपयोग कर सकती है; लेकिन यह उस फ़ंक्शन को सूचित करने के लिए अन्य कॉलमों का संदर्भ नहीं दे सकता है जो मूल्य को स्ट्रीम करना चाहिए।

आप कुछ ऐसा कर सकते हैं जो काम करता है, लेकिन आप शायद इसे सरल नहीं मानेंगे। उपर्युक्त समस्याओं को बदले में संबोधित करते हुए:

  1. multiseq (partition_id, next_val) जैसे स्कीमा के साथ सभी विभाजनों के लिए अगले मान को स्टोर करने के लिए एक तालिका का उपयोग करें। dblink के माध्यम से है

    1. एक नई लेन-देन बनाएं वर्तमान लेन-देन पर स्वतंत्र (एक ऐसा करने का तरीका, मेरा मानना ​​है कि कुछ अन्य सर्वर भाषाओं इसे और अधिक कर सकते हैं:
    2. एक multinextval(seq_table, partition_id) समारोह है कि निम्नलिखित की तरह कुछ करता लिखें आसानी से)।

    3. seq_table में उल्लिखित तालिका को लॉक करें।
    4. उस पंक्ति को अद्यतन करें जहां विभाजन आईडी partition_id है, जो एक बढ़ी हुई मान के साथ है। (या यदि कोई मौजूदा कोई नहीं है तो मूल्य 2 के साथ एक नई पंक्ति डालें।)
    5. लेनदेन को प्रतिबद्ध करें और पिछली संग्रहीत आईडी (या 1) को वापस करें।
  2. सम्मिलन के लिए multinextval('projects_table', NEW.Project_ID) के लिए एक कॉल का उपयोग करता है अपनी परियोजनाओं की मेज पर एक डालने ट्रिगर बनाएं।

मैंने इस पूरी योजना का उपयोग स्वयं नहीं किया है, लेकिन मैंने व्यक्तिगत रूप से प्रत्येक चरण के समान कुछ करने की कोशिश की है। multinextval फ़ंक्शन के उदाहरण और ट्रिगर प्रदान किया जा सकता है यदि आप इसका प्रयास करना चाहते हैं ...

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