2012-01-18 16 views
6

पर एक सशर्त अद्वितीय सूचकांक कैसे जोड़ें मैं एक line_items तालिका है:निम्नलिखित कॉलम के साथ PostgreSQL

product_id 
variant_id 

variant_id व्यर्थ है।

  • तो variant_id शून्य है तो product_id अद्वितीय होना चाहिए:

    यहाँ स्थिति है।

  • यदि variant_id का मूल्य है तो product_id और variant_id का संयोजन अद्वितीय होना चाहिए।

क्या यह PostgreSQL में संभव है?

CREATE UNIQUE INDEX line_items_prod_id_var_id_idx 
ON line_items (product_id, variant_id); 

हालांकि, इस (1, NULL) के कई प्रविष्टियों के लिए (product_id, variant_id) क्योंकि NULL मान समान नहीं माना जाता है की अनुमति होगी:

उत्तर

20

एक UNIQUE multicolumn INDEX(product_id, variant_id) पर बनाएँ।
कि के लिए साइन अप करने के लिए, इसके अलावा एक partial UNIQUE INDEXproduct_id पर बनाने के लिए:

CREATE UNIQUE INDEX line_items_prod_id_var_null_idx 
ON line_items (product_id) 
WHERE variant_id IS NULL; 

इस तरह आप (1,2), (1,3) और (1, NULL), लेकिन उनमें से न तो एक दूसरी बार प्रवेश कर सकते हैं। एक या दोनों कॉलम पर स्थितियों के साथ प्रश्नों को भी गति देता है।

यह answer on dba.SE मैंने हाल ही में लिखा है बहुत ही समान है और लगभग आपकी समस्या पर सीधे लागू होता है।

0

एक और विकल्प अपने प्रमुख क्षेत्रों में अभिव्यक्तियों का उपयोग करना है। जब आप सवाल पूछते हैं तो यह आसपास नहीं हो सकता है, लेकिन यह उन लोगों के लिए उपयोगी हो सकता है जो इस समय आते हैं।

CREATE UNIQUE INDEX line_items_prod_id_var_id_idx 
ON line_items (product_id, (coalesce(variant_id, 0))); 

दी, इस मान लिया गया है कि आपके variant_id एक स्वत: incrementing पूर्णांक कि 1. पर शुरू कर दिया इसके अलावा अभिव्यक्ति के आसपास कोष्ठक ध्यान दें है। दस्तावेज़ों के अनुसार, वे आवश्यक हैं।

http://www.postgresql.org/docs/9.3/static/sql-createindex.html

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