gpt4 book ai didi

postgresql - 如何根据第二层、触发器、postgreSQL自动更新列

转载 作者:行者123 更新时间:2023-11-29 13:29:13 25 4
gpt4 key购买 nike

我是 postgreSQL 的新手。我有 2 个表,observation 和 landcover,我想创建一个触发器,允许根据第二层(表)landcover.code_06 的空间信息更新列 observation.land。

我的意思是,如果我在 QGIS 中更新点层观察,我希望在属性表中 LAND 列中的信息与 CODE_06 列中的信息相同。

我已经创建了这个,但我不知道哪里出了问题或为什么它不起作用。


ALTER TABLE observation ADD COLUMN land varchar (20)

CREATE OR REPLACE FUNCTION landinfo_land()
RETURNS trigger AS
$BODY$
BEGIN
NEW.land := observation.land

FROM observation.land AS b, landcover.code_06 AS w
WHERE w.geom && NEW.geom AND
ST_Intersects(ST_PointOnSurface(NEW.geom), b.geom);
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION landinfo_land() OWNER TO postgres;


CREATE TRIGGER update_land_value
BEFORE INSERT OR UPDATE
ON observation
FOR EACH ROW
EXECUTE PROCEDURE landinfo_land();

最佳答案

这个:

 NEW.land := observation.land

FROM observation.land AS b, landcover.code_06 AS w
WHERE w.geom && NEW.geom AND
ST_Intersects(ST_PointOnSurface(NEW.geom), b.geom);

没有任何意义。

看起来您正在尝试使用子查询而不是简单的表达式,但是没有 SELECT 关键字。你不能那样做,即使在 PL/PgSQL 中也是如此。如果它不仅仅是一个没有 SQL 查询关键字的简单表达式,则它必须是一个有效的查询。

尝试:

 SELECT INTO STRICT NEW.land  observation.land
FROM observation.land AS b, landcover.code_06 AS w
WHERE w.geom && NEW.geom AND
ST_Intersects(ST_PointOnSurface(NEW.geom), b.geom);

是的,语法很丑。

如果问题仍然存在,请检查 PostgreSQL 服务器错误日志。它们将包含错误消息,指示在执行您的 PL/PgSQL 函数时出了什么问题,这将帮助您找到其他问题。

关于postgresql - 如何根据第二层、触发器、postgreSQL自动更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27648149/

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