列がある場合はcolumn a
指定された値の場合、別の列が必要ですcolumn b
はdefault value
の値に応じてcolumn a
別の言葉で:
場合column a = 'peter'
、次にcolumn b default value = 'doctor'
。
これは不可能です単純なDEFAULT
値では マニュアルには明確に記載されています :
値は任意の変数のない式です(サブクエリおよび現在のテーブルの他の列への相互参照は許可されていません)。
代わりに trigger を使用できます:
CREATE OR REPLACE FUNCTION trg_foo_b_default()
RETURNS trigger 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, you could use a lookup table:
SELECT INTO NEW.b t.b
FROM def_tbl t
WHERE t.a = NEW.a;
*/
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
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
から派生した値に置き換えられます。