2021-09-17 अपडेट :आज तक, gerardnll एक बेहतर उत्तर (सर्वश्रेष्ठ IMO) प्रदान करता है :
लोगों को सबसे स्वच्छ समाधान खोजने में मदद करने के लिए, मैं आपको gerardnll's answer को अपवोट करने की सलाह देता हूं। ।
(FYI करें, मैं वही व्यक्ति हूं जिसने मूल प्रश्न पूछा था।)
2013 से मेरा मूल उत्तर यह है
"constraint -- one या अन्य कॉलम रिक्त नहीं है" PostgreSQL संदेश बोर्ड :
ALTER TABLE my_table ADD CONSTRAINT my_constraint CHECK (
(column_1 IS NULL) != (column_2 IS NULL));
(लेकिन उपरोक्त दृष्टिकोण तीन या अधिक स्तंभों के लिए सामान्यीकृत नहीं है।)
यदि आपके पास तीन या अधिक कॉलम हैं, तो आप a_horse_with_no_name द्वारा सचित्र सत्य तालिका दृष्टिकोण का उपयोग कर सकते हैं। . हालांकि, मैं निम्नलिखित को बनाए रखना आसान मानता हूं क्योंकि आपको तार्किक संयोजनों को टाइप करने की आवश्यकता नहीं है:
ALTER TABLE my_table
ADD CONSTRAINT my_constraint CHECK (
(CASE WHEN column_1 IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN column_2 IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN column_3 IS NULL THEN 0 ELSE 1 END) = 1;
इसे संक्षिप्त करने के लिए, एक कस्टम फ़ंक्शन बनाना उपयोगी होगा ताकि CASE WHEN column_k IS NULL THEN 0 ELSE 1 END
बॉयलरप्लेट को कुछ इस तरह छोड़कर हटाया जा सकता है:
(non_null_count(column_1) +
non_null_count(column_2) +
non_null_count(column_3)) = 1
यह उतना ही कॉम्पैक्ट हो सकता है जितना पीएसक्यूएल अनुमति देगा (?) उस ने कहा, यदि संभव हो तो मैं इस तरह के सिंटैक्स में जाना पसंद करूंगा:
non_null_count(column_1, column_2, column_3) = 1