gpt4 book ai didi

postgresql - 如何在 PostgreSQL/PostGIS 中 INSERT 触发器后更新表新值?

转载 作者:行者123 更新时间:2023-12-02 19:24:49 25 4
gpt4 key购买 nike

我尝试自动化数据库中表的一些计算。我尝试对表中新插入的行执行一些UPDATE,但我之前使用过NEWOLD 语句。我尝试编写代码,通过分配 NEW.[tablename] 来更新新值,但它不起作用。触发器函数的开头是否有任何语句指定仅在新值上运行该函数,我找不到有关此的有用信息。

CREATE OR REPLACE FUNCTION cost_estimation() 
RETURNS TRIGGER AS
$func$
DECLARE
a INTEGER := 3;

BEGIN
UPDATE NEW.cost_table
SET column4 = a;

UPDATE NEW.cost_table
SET column 5 = column4 - column2;

[...]


RETURN NEW;
END
$func$ language plpgsql

更新:感谢您到目前为止的回答。我原来的代码是基于update结构编写的,省略UPDATE时需要重写。我应该举一个更好的例子来说明我的情况。简单来说:我有一个表(T1),它将填充另一个表(T2)中的数据。将数据从 T2 插入 T1 后,我想对 T1 内的新值运行计算。(代码包括 PostGIS 功能):

  CREATE OR REPLACE FUNCTION cost_estimation() 
RETURNS TRIGGER AS
$func$

BEGIN

NEW.column6 = column2 FROM external_table WHERE
St_Intersects(NEW.geom, external_table.geom) LIMIT1;


NEW.column8 = CASE
WHEN st_intersects(NEW.geom, external_table2.geom) then 'intersects'
WHEN (NEW.column9 = 'K' and NEW.column10 <= 6) then 'somethingelse'
ELSE 'nothing'
END
FROM external_table2;


[...]


RETURN NEW;
END
$func$ language plpgsql

CREATE TRIGGER table_calculation_on_new
BEFORE INSERT OR UPDATE ON cost_estimation
FOR EACH ROW EXECUTE PROCEDURE road_coast_estimation();

在表中插入值后,不会执行任何计算。

UPDATE2:我再次检查了表,发现另一个触发器正在阻止表操作。感谢@a_horse_with_no_name,下半部分的代码现在工作正常。

最佳答案

NEWOLD 不是“语句”,它们是 records表示触发触发器的 DML 语句中修改的行。

假设触发器是在 cost_table 上定义的,您只需更改 NEW 记录中的字段即可。无需更新任何内容:

CREATE OR REPLACE FUNCTION cost_estimation() 
RETURNS TRIGGER AS
$func$
DECLARE
a INTEGER := 3;
BEGIN
new.column4 := a;
new.column5 := new.column4 - new.column2;
return new;
END;
$func$ language plpgsql

为此,需要将触发器定义为 BEFORE 触发器:

create trigger cost_table_trigger  BEFORE insert or update on cost_table  for each row execute procedure cost_estimation();

关于postgresql - 如何在 PostgreSQL/PostGIS 中 INSERT 触发器后更新表新值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62534782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com