कस्टम अद्वितीय स्तंभ बाधा, केवल एक स्तंभ का विशिष्ट मान होने पर लागू किया जाता है


19

क्या इस प्रकार एक कस्टम अद्वितीय कॉलम बाधा होना संभव है? मान लीजिए कि मेरे पास दो कॉल हैं, subsetऔर type, दोनों स्ट्रिंग्स (हालांकि डेटा प्रकार शायद कोई फर्क नहीं पड़ता)।

यदि type"सच" है, तो मैं चाहता हूं कि संयोजन typeऔर subsetअद्वितीय हो। अन्यथा कोई अड़चन नहीं है। मैं डेबियन पर PostgreSQL 8.4 का उपयोग कर रहा हूं।


जवाबों:


31

दूसरे शब्दों में, यदि आप subsetअद्वितीय होना चाहते हैं type = 'true'
एक आंशिक अनोखा सूचकांक यह करेगा कि:

CREATE UNIQUE INDEX tbl_some_name_idx ON tbl (subset) WHERE type = 'true';

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


धन्यवाद इरविन। जब मैंने दस्तावेज़ को देखा तो मुझे यह विकल्प दिखाई नहीं दिया। एक और सीधा लिंक postgresql.org/docs/current/interactive/indexes-partial.html है । उदाहरण देखें 11-3।
फहीम मीठा

@FaheemMitha: मैं, एक स्तर उच्च जुड़ा हुआ जब से तुम करने की आवश्यकता है गठबंधन एक आंशिक सूचकांक एक साथ अद्वितीय सूचकांक
एरविन ब्रान्डेसटेटर

1
@ इरविन वह पृष्ठ (आंशिक अनुक्रमित के बारे में), में आंशिक अद्वितीय सूचकांक के साथ एक उदाहरण है।
ypercube y

@ypercube: आह, ठीक है। यही बेहतर कड़ी है। मैंने उस अंतिम अध्याय को इंगित करने के लिए अपना उत्तर बदल दिया।
एरविन ब्रान्डेसटेटर

6

यह ऊपर इरविन के उत्तर का पूरक है, लेकिन PostgreSQL इंडेक्स के प्रकारों के एक समूह का समर्थन करता है। ये आम तौर पर परस्पर अनन्य नहीं होते हैं। आप इन के रूप में सोच सकते हैं:

  • सूचकांक विधि (btree, GiST, GIN, आदि)। एक चुनें, यदि आवश्यक हो (डिफ़ॉल्ट होने के नाते)
  • आंशिक या भरा हुआ। यदि आंशिक जहां एक खंड का उपयोग करें
  • प्रत्यक्ष या क्रियाशील। आप फ़ंक्शन के आउटपुट को अनुक्रमित कर सकते हैं।
  • अद्वितीय या गैर-अद्वितीय

इन सभी को विभिन्न तरीकों से जोड़ा जा सकता है। आप यहां जो कुछ भी कर रहे हैं, वह अद्वितीय और आंशिक सुविधाओं का उपयोग कर रहा है, जिससे आपको आंशिक अद्वितीय अनुक्रमित मिलें (जो कि आपके लिए बहुत उपयोगी हैं क्योंकि आप पता लगा रहे हैं।

लेकिन मान लीजिए कि आप सब्सेट फ़ील्ड पर एक केस असंवेदनशील इंडेक्स रखना चाहते हैं, जहाँ प्रकार सत्य हो। तब आप एक कार्यात्मक परिभाषा जोड़ेंगे:

CREATE INDEX my_index_name_idx_u ON tbl (lower(subset)) WHERE type;

ध्यान दें कि यह सबसेट विशेषता पर निम्न () फ़ंक्शन के आउटपुट पर एक अद्वितीय सूचकांक बनाता है जहां प्रकार सत्य है।


तो इरविन के जवाब में सूचकांक प्रत्यक्ष है, जबकि कार्यात्मक, सही में आपके उदाहरण में एक?
फहीम मीठा

@ फहीममिथ: सही।
एरविन ब्रान्डेसटेटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.