PostGIS 更新触发器
PostGIS update trigger
我有 table_1 列 point_id 和 geometry (观点) ,
table_2 有列:area_id、geometry(多边形)和table_3,其中包含 table_1[ 中所有 point_id 的列表=37=] 和 area_id 来自 table_2 ,如果点在多边形内。
每次将新多边形添加到 table_2 时,我都会尝试更新 table_3,因此point_id 和 area_id 为 table_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 中删除条目
我有 table_1 列 point_id 和 geometry (观点) , table_2 有列:area_id、geometry(多边形)和table_3,其中包含 table_1[ 中所有 point_id 的列表=37=] 和 area_id 来自 table_2 ,如果点在多边形内。
每次将新多边形添加到 table_2 时,我都会尝试更新 table_3,因此point_id 和 area_id 为 table_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 中删除条目