2011-03-27 15 views
17

अगर मैं Postgresql में एक टेबल है:PostgreSQL में एक एक बाहर के दो नहीं अशक्त बाधा जोड़ने

create table Education ( 
    id     integer references Profiles(id), 
    finished   YearValue not null, 
    started    YearValue, 
    qualification  text, 
    schoolName   text, 
    studiedAt   integer references Organizations(id), 
    primary key (id) 
); 

मैं एक बाधा बनाने के लिए इतना है कि या तो schoolName या studiedAt जरूरतों नहीं करने के लिए अशक्त हो की जरूरत है (उनमें से एक को इसमें जानकारी होनी चाहिए)।

मैं यह कैसे कर सकता हूं?

उत्तर

26

आप check constraint उदा।

constraint chk_education check (schoolName is not null or studiedAt is not null) 
पुस्तिका से

:

एक चेक बाधा सबसे सामान्य अवरोध प्रकार है। यह आपको यह निर्दिष्ट करने की अनुमति देता है कि किसी निश्चित कॉलम में मान को बूलियन (सत्य-मूल्य) अभिव्यक्ति को पूरा करना होगा।

संपादित करें: Pithyless 'व्याख्या के साथ पालन करने के लिए वैकल्पिक:

constraint chk_education check ((schoolName is not null and studiedAt is null) or (schoolName is null and studiedAt is not null)) 
+1

यह चेक स्कूल नाम और अध्ययन दोनों के खिलाफ सुरक्षा नहीं करता है सेट होने पर, जो मुझे लगता है कि ओपी को भी दिमाग में था। – pithyless

+0

प्रश्न एक ऐसे आविष्कार के लिए पूछता है जो कम से कम 'स्कूल नाम' पर बल देता है और 'अध्ययन' में कुछ जानकारी होती है। मैंने उस बाधा का एक संस्करण जोड़ा है जो आपकी टिप्पणी का अनुपालन करता है हालांकि मैं इस प्रश्न की व्याख्या से सहमत नहीं हूं। –

+2

यह थोड़ी देर हो चुकी है, लेकिन यह एक एक्सओआर बाधा है ताकि आप इसे 'चेक ((स्कूल नाम आईएस नल) के रूप में व्यक्त कर सकें <> (अध्ययन किया गया है नल)) ' – norcalli

0

तुम भी अद्यतन पर एक ट्रिगर का उपयोग करें और यह देखना होगा कि एक नियम तालिका में डेटा अनुमति देने से पहले पीछा किया जाता है सम्मिलित कर सकते हैं। जब आप चेक बाधा को अधिक जटिल तर्क की आवश्यकता होती है तो आप आमतौर पर इस प्रकार के दृष्टिकोण का उपयोग करेंगे।

+1

चेतावनी: अक्सर बेहतर होता है कि एक रिसॉर्ट की तुलना में बाधा को लागू न करें ट्रिगर –

+0

मैं कहूंगा कि ट्रिगर का उपयोग करने से बाधा को लागू नहीं करना बेहतर होगा, मैं oposite कह सकता हूं। ट्रिगर का उपयोग करते समय हमेशा ध्यान रखें और उन्हें बुद्धिमानी से उपयोग करें। इसका उपयोग करने के लिए उन्हें इस्तेमाल न करें। उन्हें विशिष्ट आवश्यकताओं के लिए परीक्षण करें और यदि यह आपको अपनी आवश्यकताओं को पूरा करने की अनुमति देता है तो इसके लिए जाएं। एक ट्रिगर का उपयोग करने के साथ निहित बुराई नहीं है। यह बॉक्स में एक और उपकरण है। – Kuberchaun

+0

मुझे लगता है कि यह [बहस पहले] किया गया है (http://stackoverflow.com/questions/460316/are-डेटा-triggers-evil)। उनके साथ मेरा गपशप यह है कि वे मौजूदा डेटा पर नियमों को लागू नहीं करते हैं और उनके बिना फायरिंग (जैसे ओककल के लिए एसक्यूएल * लोडर) में डेटा प्राप्त करने के लिए अक्सर उनके रास्ते होते हैं। यह देखते हुए कि, अच्छी तरह से परिभाषित लेनदेन के साथ एक एपीआई किसी भी दुष्प्रभाव के बिना कम डेटा अखंडता प्रदान करता है (और एक बहुत अधिक लाभ) –