Това ене е възможно с обикновен 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
клауза в дефиницията на тригера (достъпна от Postgres 9.0):По този начин функцията за задействане се изпълнява само когато е действително полезна. (Ако приемем, че можем да оставим b IS NULL
слайд, ако a IS NULL
.)
Работи подобно, нолеко различно мода от DEFAULT
стойност.
Със стойност по подразбиране можете изрично да вмъкнете NULL
за да отмените по подразбиране. Това не е възможно тук, NULL
в b
се заменя със стойността, получена от a
.