これは不可能です シンプルな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
から派生した値に置き換えられます 。