2012-06-13 13 views
7

मैं अपने डेटाबेस में एक विषय के लिए एकाधिक पते स्टोर करने का एक तरीका ढूंढना चाहता हूं, प्रति विषय केवल एक डिफ़ॉल्ट पता के साथ।दो कॉलम पर अनन्य बाधा पोस्ट करें: इंटीजर और बूलियन

एक लम्बी कहानी ही समाप्त हो करने के लिए, मान लीजिए कि हम एक मेज है:

CREATE TABLE test 
(
    id integer NOT NULL, 
    active boolean NOT NULL, 
    CONSTRAINT pk_id PRIMARY KEY (id) 
) 

तालिका में प्रत्येक आईडी के लिए, वहाँ अधिकतम 1 सच सक्रिय मान होना चाहिए।

मैं इसे कैसे प्राप्त कर सकता हूं?

धन्यवाद।

create unique index some_index on test (id) where active; 

@ThiefMaster के रूप में कहा गया है प्राथमिक सूचकांक निकाल देना चाहिए:

+0

दरअसल आपको * कुछ भी * करने की ज़रूरत नहीं है क्योंकि 'आईडी' प्राथमिक कुंजी होने के कारण यह अद्वितीय है इसलिए * एक ही आईडी के साथ * दो पंक्तियां नहीं हो सकती हैं। – ThiefMaster

+0

यदि आप प्राथमिक के रूप में 'id' नहीं चाहते हैं तो आपको एक ट्रिगर लिखना होगा: http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html लेकिन शायद वह नहीं जो आप चाहते हैं। –

उत्तर

11

Partial index तुम क्या चाहते है।

+0

धन्यवाद। यह ठीक है क्योंकि मेरे पीके इस तालिका में पता पीके है। यह भी काम करता है: UNIQUE INDEX बनाएं कुछ_इंडेक्स परीक्षण पर परीक्षण (सक्रिय, आईडी) सक्रिय कहां; – greatkalu

+0

आपको ध्यान देना चाहिए कि आपकी क्वेरी में वास्तव में जो चीज आपने बदल दी है वह इंडेक्स में सक्रिय है। सक्रिय होने पर सभी क्षेत्रों के लिए हमेशा सत्य होता है कि इंडेक्सिंग के लिए एक विषय में आपने कुछ ब्लोट जोड़ा है। – kworr

+1

पीके सिर्फ अद्वितीय और न ही नई बाधाओं का एक योग है। – kworr

3

इस प्रश्न के मामले में पहले इसकी व्याख्या की आवश्यकता नहीं है।

लेकिन एफवाईआई, आप विभिन्न प्रकारों के साथ 2 या अधिक (गैर-प्राथमिक कुंजी) कॉलम सेट कर सकते हैं। उदाहरण के लिए:

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (integer_column, boolean_column); 

अधिक जानकारी के लिए, Constraints, "अद्वितीय प्रतिबन्ध" खंड के लिए Postgres दस्तावेज़ नहीं देख। के शब्दों में:

एक अद्वितीय बाधा कॉलम के एक समूह को संदर्भित करता है, तो कॉलमों अल्पविराम के द्वारा अलग सूचीबद्ध हैं ...

यह निर्दिष्ट करता है कि संकेत दिया स्तंभ में मान के संयोजन पूरे मेज के पार अद्वितीय है, हालांकि कॉलम में से किसी एक को अद्वितीय (और आमतौर पर नहीं) अद्वितीय होना चाहिए।

नोट: एक partial index एक सूचकांक एक मेज है, जो एक पूरी तरह से अलग उद्देश्य है के एक सबसेट के ऊपर बना हुआ करता है।

+0

मुझे लगता है कि आपके समाधान के साथ उसके पास कई गैर सक्रिय पते नहीं हो सकते हैं। – Hossein

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