Dit is niet mogelijk met een simpele DEFAULT
waarde, zoals duidelijk in de handleiding staat:
De waarde is een variabele-vrije expressie (subquery's en kruisverwijzingen naar andere kolommen in de huidige tabel zijn niet toegestaan).
Je zou een trigger . kunnen gebruiken in plaats daarvan:
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();
Gebruik een WHEN
. om het efficiënter te maken clausule in de triggerdefinitie (beschikbaar sinds Postgres 9.0):Op deze manier wordt de triggerfunctie alleen uitgevoerd als het echt nuttig is. (Ervan uitgaande dat we b IS NULL
kunnen laten schuif als a IS NULL
.)
Werkt in een soortgelijk, maar subtiel anders mode van een DEFAULT
waarde.
Met een standaardwaarde kunt u expliciet NULL
invoegen om de standaard te overschrijven. Dat is hier niet mogelijk, NULL
in b
wordt vervangen door de waarde afgeleid van a
.