To není možné s jednoduchým DEFAULT
hodnota, jak je v návodu jasně uvedeno:
Hodnota je jakýkoli výraz bez proměnných (poddotazy a křížové odkazy na jiné sloupce v aktuální tabulce nejsou povoleny).
Můžete použít spouštěč místo toho:
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();
Chcete-li to zefektivnit, použijte WHEN
klauzule v definici spouštění (dostupná od Postgresu 9.0):Tímto způsobem se spouštěcí funkce provádí pouze tehdy, když je skutečně užitečná. (Za předpokladu, že můžeme nechat b IS NULL
slide if a IS NULL
.)
Funguje podobně, ale jemně se liší móda z DEFAULT
value.
S výchozí hodnotou můžete explicitně vložit NULL
přepsat výchozí. To zde není možné, NULL
v b
je nahrazeno hodnotou odvozenou z a
.