Detta är inte möjligt med en enkel DEFAULT
värde, som manualen tydligt säger:
Värdet är valfritt variabelfritt uttryck (underfrågor och korsreferenser till andra kolumner i den aktuella tabellen är inte tillåtna).
Du kan använda en trigger istället:
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();
För att göra det mer effektivt använd en WHEN
klausul i triggerdefinitionen (tillgänglig sedan Postgres 9.0):På så sätt exekveras triggerfunktionen bara när den faktiskt är användbar. (Förutsatt att vi kan låta b IS NULL
skjut om a IS NULL
.)
Fungerar i en liknande, men subtilt annorlunda mode från en DEFAULT
värde.
Med ett standardvärde kan du uttryckligen infoga NULL
för att åsidosätta standardinställningen. Det är inte möjligt här, NULL
i b
ersätts med värdet som härrör från a
.