PostgreSQL - 根据另一个单元格值设置默认单元格值

时间:2013-05-24 14:46:06

标签: postgresql database-design triggers default-value postgresql-9.2

如果我的列中有任何给定值的column a,我希望其他列column b根据default value column a >

换句话说:
如果column a = 'peter'然后column b default value = 'doctor'

1 个答案:

答案 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派生的值。