Как сделать UPSERT несколькими строками с одинаковым конфликтом в PostgreSQL? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть таблица, которая выглядит следующим образом:

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();
...