Postgresql

用於更新多列的 postgresql 觸發器

  • January 7, 2021

我在某個表中有一個列,我想與 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();

2 個表對每條記錄共享相同的值partner_id,但您可能已經猜到,此觸發器對每個真實條件執行查詢,因此當我在第一個表上修改一條記錄時,觸發器會導致 800(例如)修改發生對於每對匹配partner_id

如何單獨修改與第一個表上已修改記錄匹配的記錄?

您需要將查詢更改為如下所示:

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操作創建觸發器。

引用自:https://serverfault.com/questions/291764