यह संभव नहीं एक सरल 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
से प्राप्त मूल्य के साथ प्रतिस्थापित किया गया है।
स्रोत
2013-05-25 23:48:22
विस्तारित और संक्षिप्त उत्तर के लिए धन्यवाद – mosid