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

时间:2020-04-05 10:03:40

标签: postgresql join postgis point database-trigger

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

表_1:

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

表_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();

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

1 个答案:

答案 0 :(得分: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,现在一切正常。

相关问题