Postgresql 插入触发器时从其他表复制值,postgres

Postgresql 插入触发器时从其他表复制值,postgres,postgresql,triggers,Postgresql,Triggers,我对PostgreSQL非常陌生,已经花了太多的时间来尝试找到一个适合我想做的事情的例子。所以我希望我能在这里得到一些帮助 我有两张桌子,叫他们“人”和“地址” 我想创建一个触发器,当我在person_id=oid的第一个表中插入person_id的新值时,它从表地址复制street和house_nr 桌上人 个人识别码 街道 房屋编号 其他属性 表地址 oid 街道 房屋编号 其他属性 像这样的 INSERT INTO person set person.street = address.st

我对PostgreSQL非常陌生,已经花了太多的时间来尝试找到一个适合我想做的事情的例子。所以我希望我能在这里得到一些帮助

我有两张桌子,叫他们“人”和“地址”

我想创建一个触发器,当我在person_id=oid的第一个表中插入person_id的新值时,它从表地址复制street和house_nr

桌上人
个人识别码
街道
房屋编号
其他属性

表地址
oid
街道
房屋编号
其他属性

像这样的

INSERT INTO person
set person.street = address.street,
    person.house_nr = address.house_nr
FROM address
WHERE person_id = oid
希望有人有时间帮忙
干杯

首先,您需要创建一个触发函数。(有关的详细资料)

然后需要将此函数添加到表中。(有关的详细资料)


我没有尝试这个特定的解决方案。不管怎样,我只是在Postgres 9.3上修改了我自己的触发器。但是我不明白你为什么要它。在两个地方有相同的数据是多余的,因为你可以访问地址数据。是的,我这里有一个列的简单示例,它看起来是多余的。我将在一个应用程序中使用它,其中用户将键入id,其他字段将自动填充。“主表”是通过多个表的视图生成的。另一种有用的情况是,关联的数据可以随时间变化,但当前表是历史记录,应该保持静态。谢谢!!我会继续尝试的谢谢,它工作得很好。它也让我对如何编写触发器有了更多的了解。非常感谢!!
CREATE OR REPLACE FUNCTION func_before_trigger_on_person()
  RETURNS trigger AS
$BODY$
BEGIN
    SELECT address.street, address.house_nr
        INTO NEW.street, NEW.house_nr
    FROM address
    WHERE address.oid = NEW.person_id;

    RETURN NEW;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
CREATE TRIGGER before_trigger_on_person
  BEFORE INSERT OR UPDATE
  ON person
  FOR EACH ROW
  EXECUTE PROCEDURE func_before_trigger_on_person();