यह संभव नहीं है एक साधारण DEFAULT
. के साथ मान, जैसा कि मैनुअल स्पष्ट रूप से बताता है:
मान किसी भी चर-मुक्त अभिव्यक्ति है (वर्तमान तालिका में अन्य स्तंभों के लिए उपश्रेणी और क्रॉस-रेफरेंस की अनुमति नहीं है)।
आप एक ट्रिगर . का उपयोग कर सकते हैं इसके बजाय:
CREATE OR REPLACE FUNCTION trg_foo_b_default()
RETURNS trigger
LANGUAGE plpgsql 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, consider a lookup table:
SELECT INTO NEW.b t.b
FROM def_tbl t
WHERE t.a = NEW.a;
*/
RETURN NEW;
END
$func$;
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
. का उपयोग करें ट्रिगर परिभाषा में क्लॉज (पोस्टग्रेज 9.0 के बाद से उपलब्ध):इस तरह ट्रिगर फ़ंक्शन केवल तभी निष्पादित होता है, जब यह वास्तव में उपयोगी होता है। (यह मानते हुए कि हम b IS NULL
दे सकते हैं स्लाइड करें यदि a IS NULL
।)
समान रूप से काम करता है, लेकिन सूक्ष्म रूप से भिन्न एक DEFAULT
. से फैशन value.
डिफ़ॉल्ट मान के साथ, आप स्पष्ट रूप से NULL
. डाल सकते हैं डिफ़ॉल्ट को रद्द करने के लिए। यह यहाँ संभव नहीं है, NULL
b
. में a
. से प्राप्त मान से बदल दिया जाता है ।