Questo non è possibile con un semplice DEFAULT
valore, come afferma chiaramente il manuale:
Il valore è qualsiasi espressione priva di variabili (non sono consentiti sottoquery e riferimenti incrociati ad altre colonne nella tabella corrente).
Potresti usare un trigger invece:
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();
Per renderlo più efficiente usa un WHEN
clausola nella definizione del trigger (disponibile da Postgres 9.0):in questo modo la funzione trigger viene eseguita solo quando è effettivamente utile. (Supponendo che possiamo lasciare che b IS NULL
diapositiva se a IS NULL
.)
Funziona in modo simile, ma sottilmente diverso moda da un DEFAULT
value.
Con un valore predefinito, puoi inserire esplicitamente NULL
per annullare l'impostazione predefinita. Non è possibile qui, NULL
in b
viene sostituito con il valore derivato da a
.