To nie jest możliwe z prostym DEFAULT
wartość, ponieważ instrukcja wyraźnie stwierdza:
Wartość jest dowolnym wyrażeniem wolnym od zmiennych (podzapytania i odsyłacze do innych kolumn w bieżącej tabeli są niedozwolone).
Możesz użyć wyzwalacza zamiast tego:
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();
Aby uczynić go bardziej wydajnym, użyj WHEN
klauzula w definicji wyzwalacza (dostępna od Postgres 9.0):W ten sposób funkcja wyzwalacza jest wykonywana tylko wtedy, gdy jest rzeczywiście przydatna. (Zakładając, że możemy pozwolić b IS NULL
przesuń, jeśli a IS NULL
.)
Działa w podobnym, ale nieco innym moda z DEFAULT
wartość.
Przy wartości domyślnej możesz jawnie wstawić NULL
aby zastąpić wartość domyślną. Tutaj nie jest to możliwe, NULL
w b
jest zastępowane wartością pochodzącą z a
.