У меня есть таблица, которая выглядит следующим образом:
poly_id | class | percent_value
-------------------------
210 | 10 | 60
210 | 12 | 40
211 | 19 | 100
Когда я создаю новые полигоны (например, poly_id=211
), он вставляет вышеупомянутую запись с помощью функции триггера ниже. Иногда мне нужно обновить geom ранее вставленного многоугольника, например poly_id=210
. Обновленный геом poly_id=210
теперь будет охватывать три класса земель вместо двух. Как я могу написать триггер, чтобы он обновлял (или удалял) предыдущие записи? Я попытался
ON CONFLICT (poly_id) DO UPDATE
, но, похоже, он не работает, и я думаю, что невозможно UPSERT на нескольких строках с одним и тем же конфликтом_предназначения (poly_id) (?). Также проблема, я полагаю, в том, что в любом случае нужно вставить третью запись. Есть ли какие-либо предложения, как записать триггер, чтобы он обновлял или удалял предыдущие записи с тем же poly_id, а затем выдает такой результат:
poly_id | class | percent_value
-------------------------
210 | 10 | 50
210 | 12 | 30
210 | 13 | 20
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();