我不熟悉具有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();
我无法使此功能正常工作。
我可以设法使该功能正常工作,问题出在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
,现在一切正常。