![postgresql触发器用于更新多列](https://linux22.com/image/555821/postgresql%E8%A7%A6%E5%8F%91%E5%99%A8%E7%94%A8%E4%BA%8E%E6%9B%B4%E6%96%B0%E5%A4%9A%E5%88%97.png)
我想将某个表中的一列与 PostgreSQL 数据库中另一个表中的列匹配,因此我尝试创建一个可以实现此目的的触发器:
CREATE OR REPLACE FUNCTION modify_res_partner() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
UPDATE res_partner
SET x_street1=res_partner_address.street
FROM res_partner_address
WHERE res_partner.id=res_partner_address.partner_id;
END IF;
END;
$$ LANGUAGE 'plpgsql';
CREATE TRIGGER modify_res_partner_trigger
AFTER INSERT OR UPDATE OR DELETE ON res_partner_address
FOR EACH ROW EXECUTE PROCEDURE modify_res_partner();
这两个表的每个记录都具有相同的值partner_id
,但是您可能已经猜到了,此触发器会针对每个真实条件执行查询,因此当我修改第一个表上的一条记录时,触发器会导致每个匹配对发生 800(例如)次修改partner_id
。
我怎样才能单独修改与第一个表上修改的记录相匹配的记录?
答案1
您需要将查询更改为如下形式:
UPDATE res_partner
SET x_street1=res_partner_address.street
FROM res_partner_address
WHERE res_partner.id = NEW.partner_id;
你应该利用NEW
行。在INSERT
操作时,这指的是插入的行。在操作时,它还指的是更新的行UPDATE
。
顺便说一句,您不需要创建DELETE
操作的触发器。