2011-08-30 12 views
30

मैं एक तालिका में element_type कॉलम (discussion कहा जाता है) बनाना चाहता हूं जो टेक्स्ट मान "सबक" या "प्रश्नोत्तरी" की अनुमति देता है लेकिन उस कॉलम में कोई अन्य मान डालने पर त्रुटि उत्पन्न होगी।पोस्टग्रेज़ में, आप किसी विशेष कॉलम के लिए संभावित मानों को कैसे प्रतिबंधित करते हैं?

मैं समझता हूँ कि मैं कॉलम element_id (प्राथमिक कुंजी, पूर्णांक) और element_type (अद्वितीय, पाठ) के साथ element_types नामक एक अलग तालिका बना सकते हैं और तालिका discussion संदर्भित element_types के स्तंभ element_id में एक विदेशी कुंजी foreign_element_id बना सकते हैं। या वैकल्पिक रूप से, मैं element_id पूरी तरह से भूल सकता हूं और केवल प्राथमिक कुंजी के रूप में element_type सेट कर सकता हूं। लेकिन मैं एक नई टेबल बनाने से बचना चाहता हूं।

क्या कोई नई तालिका बनाने के बिना कॉलम में संभावित मानों को प्रतिबंधित करने का एक और अधिक सरल तरीका है?

+0

कारण है कि आप एक मेज बनाने से बचने के लिए चाहते हैं? वे विशेष रूप से महंगा नहीं हैं। – SingleNegationElimination

+2

जब भी मैं संभव मूल्यों को प्रतिबंधित करना चाहता हूं, तो मेरे पास बहुत ही कम समय तक अनावश्यक अव्यवस्था के रूप में एक टेबल की लागत इतनी अधिक नहीं है। –

उत्तर

57

आप एक CHECK CONSTRAINT:

ALTER TABLE distributors 
    ADD CONSTRAINT check_types 
    CHECK (element_type = 'lesson' OR element_type = 'quiz'); 

जोड़ सकता है हालांकि IMO क्लीनर विकल्प बनाने के लिए किया जाएगा एक ENUM:

CREATE TYPE element_type AS ENUM ('lesson', 'quiz'); 
+11

उत्कृष्ट। धन्यवाद। अन्य लोगों के लिए एक नोट के रूप में जो पोस्टग्रेज़ के रूप में नए हो सकते हैं, बनाएं, टाइप करें उपयोगकर्ता को परिभाषित प्रकार का उपयोग किसी अन्य प्रकार के रूप में करने के लिए किया जाता है जैसे कि int या टेक्स्ट का उपयोग किया जा सकता है। इस मामले में, कोई कह सकता है: 'EME (' पाठ ',' प्रश्नोत्तरी ') के रूप में टाइप तत्व टाइप प्रकार बनाएं; तालिका चर्चा ( type_of_element element_type; ); –

1

यह ट्रिगर एक अपवाद जब भी किसी को डालने या के साथ एक पंक्ति को अद्यतन करने की कोशिश फेंकता एक अवैध तत्व_ प्रकार।

CREATE OR REPLACE FUNCTION check_discussion_element_type() RETURNS TRIGGER AS $$ 
DECLARE new_element_type varchar(25); 
BEGIN 
    SELECT element_type into new_element_type 
     FROM discussion 
     WHERE discussion.element_id = NEW.element_id; 

    IF new_element_type != 'lesson' AND new_element_type != 'quiz' 
     THEN RAISE EXCEPTION 'Unexpected discussion type'; 
    END IF; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 
create trigger t_check_discussion_element_type after update or insert on discussion for each row execute procedure check_discussion_element_type(); 

आप अगर नए प्रकार एक प्रकार तालिका में मौजूद है की जाँच करने के हार्ड-कोडेड प्रकार आप इसे अनुकूलित कर सकते हैं निकालना चाहते हैं।

+1

चेक बाधा या ईएनएन की तुलना में बहुत धीमी और जटिल समाधान बनाएं। –

16

एक shorcut वाक्य रचना है:

ALTER TABLE distributors 
    ADD CONSTRAINT check_types 
    CHECK (element_type IN ('lesson', 'quiz')); 

यह करने के लिए automaticolly अनुवाद:

CONSTRAINT check_types CHECK (element_type::text = ANY (ARRAY['lesson'::character varying, 'quiz'::character varying)) 

का आनंद लें ;-)

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

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