当同一 table 中的其他字段更新时,PostgreSQL 触发器更新字段

PostgreSQL trigger to update field when other field in the same table is updated

我是 SQL 触发器的新手,我正在为此苦苦挣扎:

我有一个 table 存储有关属性及其价格的数据:

id_property price   area    price_m2
1           1500    60      25
2           3500    85      41

客户可以经常更改 属性 的 price,但 area 不会。所以我想创建一个触发器,在更新 price 列时更新 price_m2 列。

我尝试过类似的方法或类似的变体:

首先创建函数

CREATE FUNCTION update_precio_m2() RETURNS TRIGGER
AS
    $$
    BEGIN
        update my_table
        set price_m2 = new.price/old.area
        where (old.id = new.id);

        RETURN new;
    end
    $$
language plpgsql;

然后创建触发器

CREATE TRIGGER update_price_m2
    AFTER UPDATE ON my_table
    FOR EACH ROW
    WHEN (
        old.price IS DISTINCT FROM new.price
        )
    EXECUTE PROCEDURE update_price_m2();

但是当我更改 price 时,我得到了意想不到的结果,例如 price_m2 列更改为各种 id's 而我只想更改一个 id 的值](变的那个)

备注 我知道存储其值取决于其他两个列之间的操作的列是一种反模式,但在这种情况下是有原因的

谢谢!

只是为了跟进这个问题以便关闭它,我在评论中的建议是使用生成的列,它自 postgres 12 以来就可用:

https://www.postgresql.org/docs/current/ddl-generated-columns.html

语法是这样的:

CREATE TABLE my_table (
  id_property bigint GENERATED ALWAYS AS IDENTITY,
  price int,
  area int,
  price_m2 int GENERATED ALWAYS AS (price / area) STORED
);