PostGIS 更新触发器

PostGIS update trigger

我有 table_1point_idgeometry (观点) , table_2 有列:area_idgeometry(多边形)和table_3,其中包含 table_1[ 中所有 point_id 的列表=37=] 和 area_id 来自 table_2 ,如果点在多边形内。

每次将新多边形添加到 table_2 时,我都会尝试更新 table_3,因此point_idarea_idtable_1[=37 中的每个点填充=] 位于 table_2

的新多边形内
CREATE OR REPLACE FUNCTION locations_update()
RETURNS TRIGGER AS $func$
DECLARE
BEGIN 
  insert into table_3 (point_id,area_id)
    select
        table_1.point_id , new.table_2.area_id
    from
        table_1  
    join table_2  
on
    ST_WITHIN(table_1.geometry ,    new.table_2.geometry) ;
   RETURN new;
END;$func$
language plpgsql;



CREATE TRIGGER locations_update_tr AFTER INSERT ON table_2
FOR EACH ROW EXECUTE PROCEDURE locations_update();

需要对上述代码进行哪些更新才能避免唯一约束错误

ERROR: duplicate key value violates unique constraint 
DETAIL: Key (point_id, area_id)=(1, 1) already exists. 

谢谢

您正在加入两个 table,但加入条件仅考虑第一个 table,因此它最终成为 cross-join。

事实上,您根本不需要加入,因为所有必需的信息都在 NEW 对象中。

SELECT
   table_1.point_id, NEW.table_2.area_id
FROM
    table_1  
WHERE
   ST_WITHIN(table_1.geometry, NEW.table_2.geometry) ;

PS:当然,当在 table 1 或 2.

中删除条目时,您还有另一个触发器从 table 3 中删除条目