如何在PostgreSQL中向上插入具有相同冲突\u目标的多行?
我有一张这样的桌子:如何在PostgreSQL中向上插入具有相同冲突\u目标的多行?,postgresql,triggers,postgis,Postgresql,Triggers,Postgis,我有一张这样的桌子: poly_id | class | percent_value ------------------------- 210 | 10 | 60 210 | 12 | 40 211 | 19 | 100 CREATE OR REPLACE FUNCTION percent_trigger() RETURNS trigger AS $BODY$ BEGIN INSERT INTO table_name (poly_id
poly_id | class | percent_value
-------------------------
210 | 10 | 60
210 | 12 | 40
211 | 19 | 100
CREATE OR REPLACE FUNCTION percent_trigger()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO table_name (poly_id,class,percent_value)
SELECT new.id , m.dn,
ROUND(((ST_Area(ST_Intersection(m.geom, new.geom)) / ST_Area(new.geom))::numeric*100),0)
FROM poly_table AS t
JOIN class_table AS m
ON ST_Intersects(m.geom, new.geom)
GROUP BY new.id, m.dn, m.geom, new.geom
ORDER BY new.id;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER percent_calculate BEFORE INSERT OR UPDATE ON public."poly_table"
FOR EACH ROW EXECUTE PROCEDURE percent_trigger();
当我创建新多边形(例如,poly_id=211
)时,它会借助下面的触发函数插入上述记录。有时我需要更新以前插入的多边形的几何图形,例如,poly_id=210
。更新后的poly_id=210的geom将覆盖三个土地类别,而不是两个。如何写入触发器以更新(或删除)以前的记录?我试过了
ON CONFLICT (poly_id) DO UPDATE
但它似乎不起作用,我猜不可能在具有相同冲突目标(poly_id)(?)的多行上向上插入。我认为还有一个问题,它无论如何都需要插入第三条记录。是否有任何建议如何写入触发器,使其更新或删除具有相同poly_id的以前记录,然后生成此结果:
poly_id | class | percent_value
-------------------------
210 | 10 | 50
210 | 12 | 30
210 | 13 | 20
211 | 19 | 100
触发器如下所示:
poly_id | class | percent_value
-------------------------
210 | 10 | 60
210 | 12 | 40
211 | 19 | 100
CREATE OR REPLACE FUNCTION percent_trigger()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO table_name (poly_id,class,percent_value)
SELECT new.id , m.dn,
ROUND(((ST_Area(ST_Intersection(m.geom, new.geom)) / ST_Area(new.geom))::numeric*100),0)
FROM poly_table AS t
JOIN class_table AS m
ON ST_Intersects(m.geom, new.geom)
GROUP BY new.id, m.dn, m.geom, new.geom
ORDER BY new.id;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER percent_calculate BEFORE INSERT OR UPDATE ON public."poly_table"
FOR EACH ROW EXECUTE PROCEDURE percent_trigger();
这不应该是触发器函数中的
更新
而不是插入
吗?@LaurenzAlbe我更经常地创建新多边形,对于那些我认为插入
合适的多边形。但有时多边形需要编辑,因此我考虑更新。但是,由于结果可能是添加或删除上一条记录中的行(在本例中添加1行),因此UPDATE
可能对我没有帮助?那么我不理解您的问题。我认为应该始终修改预先存在的行,这在SQL中是一个更新
。@LaurenzAlbe问题是:当我创建新多边形或编辑旧多边形时,我需要一个触发器函数,以多边形覆盖的百分比计算不同的土地覆盖类别面积。添加新记录时,它可以正常工作,但编辑旧记录并保存时,poly_id的旧记录和新记录都存储在数据库中。我只希望最后一个在数据库中。我会更新这个问题,让它更清楚。非常感谢。