创建一个Postgresql触发函数来更新线串几何列

问题描述 投票:0回答:1

我不熟悉具有Postgis扩展名的Postgresql。我正在尝试创建一个触发器函数,以便在每次在表_2中插入或更新site_a,site_b时更新table_2中的几何列geom(线串)。后几列是引用表_1中的site_code的外键。

table_1:

 site_code |                        geom
-----------+----------------------------------------------------
 MIT03     | 0101000020E61000009B55BFC8CDF8174054483DD5C9254240
 BAS33     | 0101000020E6100000345EEA4A00A61A4095FAE019BDDD4140

table_2:

 link_id | site_a | site_b | geom
---------+--------+--------+------
      72 | BAS33  | MIT03  |
      57 | AI4402 | MIT03  |

这是我的职能:

CREATE OR REPLACE FUNCTION create_line() RETURNS TRIGGER
AS
$$
BEGIN
UPDATE links SET geom =ST_MakeLine((SELECT sites.geom FROM links JOIN sites ON site_code=NEW.site_a),(SELECT sites.geom FROM links JOIN sites ON site_code=NEW.site_b)) WHERE link_id=NEW.link_id;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;

触发器是:

CREATE TRIGGER t_create_line
AFTER INSERT OR UPDATE OF site_a, site_b
ON links
FOR EACH ROW
EXECUTE PROCEDURE create_line();

我无法使此功能正常工作。

postgresql join postgis point database-trigger
1个回答
0
投票

我可以设法使该功能正常工作,问题出在ST_MakeLine内部的SELECT查询中;都返回了很多行。通过添加LIMIT 1

(SELECT sites.geom FROM links JOIN sites ON site_code=site_a WHERE site_a=NEW.site_a LIMIT 1),(SELECT sites.geom FROM links JOIN sites ON site_code=site_b WHERE site_b=NEW.site_b LIMIT 1))

由于该函数更新了table_2中的所有行,因此部分解决了该问题。在更新结束时添加了条件WHERE link_id=NEW.link_id,现在一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.