17

तो मैं एक स्तंभ कहना column a किसी भी मूल्यों की है, और मैं एक और स्तंभ चाहते column b के लिए एक default value के अनुसार एक डिफ़ॉल्ट सेल मान सेट column a के मूल्य के अनुसारPostgreSQL - अन्य कक्ष मूल्य

दूसरे शब्दों में:
अगर column a = 'peter' तोcolumn b default value = 'doctor'

उत्तर

22

यह संभव नहीं एक सरल DEFAULT मूल्य के साथ है, the manual clearly states के रूप में:

मूल्य किसी भी चर-स्वतंत्र अभिव्यक्ति (सबक्वेरी और वर्तमान तालिका में अन्य स्तंभों को पार संदर्भ है की अनुमति नहीं है)।

आप एक trigger बजाय इस्तेमाल कर सकते हैं:

CREATE OR REPLACE FUNCTION trg_foo_b_default() 
    RETURNS trigger AS 
$func$ 
BEGIN 

-- For just a few constant options, CASE does the job: 
NEW.b := 
    CASE NEW.a 
    WHEN 'peter' THEN 'doctor' 
    WHEN 'weirdo' THEN 'shrink' 
    WHEN 'django' THEN 'undertaker' 
    ELSE NULL 
    END; 

/* -- For more, or dynamic options, you could use a lookup table: 
SELECT INTO NEW.b t.b 
FROM def_tbl t 
WHERE t.a = NEW.a; 
*/ 

RETURN NEW; 

END 
$func$ LANGUAGE plpgsql; 

CREATE TRIGGER b_default 
BEFORE INSERT ON foo 
FOR EACH ROW 
WHEN (NEW.b IS NULL AND NEW.a IS NOT NULL) 
EXECUTE PROCEDURE trg_foo_b_default(); 

इस और अधिक प्रभावी मैं ट्रिगर परिभाषा के साथ एक WHEN खंड (Postgres 9.0 के बाद से उपलब्ध) का उपयोग करने के लिए। इस तरह ट्रिगर फ़ंक्शन केवल तभी निष्पादित होता है जब यह वास्तव में उपयोगी होता है। मैं यहां मान रहा हूं, b IS NULL स्लाइड a IS NULL पर स्लाइड कर सकते हैं।

इसी तरह काम करता है, लेकिन मान से भिन्न फैशन अलग-अलग है।
डिफ़ॉल्ट मान के साथ, आप डिफ़ॉल्ट रूप से ओवरराल करने के लिए NULL स्पष्ट रूप से सम्मिलित कर सकते हैं। यह संभव नहीं है, b में a से प्राप्त मूल्य के साथ प्रतिस्थापित किया गया है।

+0

विस्तारित और संक्षिप्त उत्तर के लिए धन्यवाद – mosid