Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostgreSQL中向上插入具有相同冲突\u目标的多行?_Postgresql_Triggers_Postgis - Fatal编程技术网

如何在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的旧记录和新记录都存储在数据库中。我只希望最后一个在数据库中。我会更新这个问题,让它更清楚。非常感谢。