Dette er ikke muligt med en simpel DEFAULT
værdi, som manualen tydeligt siger:
Værdien er ethvert variabelfrit udtryk (underforespørgsler og krydsreferencer til andre kolonner i den aktuelle tabel er ikke tilladt).
Du kan bruge en trigger i stedet:
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();
Brug en WHEN
for at gøre det mere effektivt klausul i triggerdefinitionen (tilgængelig siden Postgres 9.0):På denne måde udføres triggerfunktionen kun, når den faktisk er nyttig. (Forudsat at vi kan lade b IS NULL
slide hvis a IS NULL
.)
Fungerer i en lignende, men subtilt anderledes mode fra en DEFAULT
værdi.
Med en standardværdi kan du udtrykkeligt indsætte NULL
for at tilsidesætte standarden. Det er ikke muligt her, NULL
i b
erstattes med værdien afledt af a
.