Ini tidak mungkin dengan DEFAULT
sederhana nilai, seperti yang dinyatakan dengan jelas oleh manual:
Nilainya adalah ekspresi bebas variabel apa pun (subkueri dan referensi silang ke kolom lain dalam tabel saat ini tidak diizinkan).
Anda dapat menggunakan pemicu sebagai gantinya:
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();
Untuk membuatnya lebih efisien gunakan WHEN
klausa dalam definisi pemicu (tersedia sejak Postgres 9.0):Dengan cara ini fungsi pemicu hanya dijalankan, ketika itu benar-benar berguna. (Dengan asumsi kita dapat membiarkan b IS NULL
geser jika a IS NULL
.)
Bekerja dengan cara yang serupa, tetapi sedikit berbeda fashion dari DEFAULT
value.
Dengan nilai default, Anda dapat secara eksplisit memasukkan NULL
untuk mengesampingkan default. Itu tidak mungkin di sini, NULL
di b
diganti dengan nilai yang diturunkan dari a
.