当同一 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
);
我是 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
);