如果我的列中有任何给定值的column a
,我希望其他列column b
根据default value
换句话说:
如果column a = 'peter'
然后column b default value = 'doctor'
。
答案 0 :(得分:41)
不可能,the manual clearly states值为trigger:
该值是任何无变量表达式(子查询和 不允许交叉引用当前表中的其他列。
您可以使用{{3}}代替:
DEFAULT
为了使这更有效,我使用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();
子句(自Postgres 9.0起可用)和触发器定义。这样,触发器功能仅在实际有用时执行。我在这里假设,如果WHEN
我们可以b IS NULL
滑动。
从a IS NULL
值开始,以类似但略有不同的方式工作。
使用默认值,您可以显式插入DEFAULT
以否决默认值。这是不可能的,NULL
中的NULL
将替换为b
派生的值。