Создание триггерной функции postgresql для обновления столбца геометрии линейной линии - PullRequest
1 голос
/ 05 апреля 2020

Я новичок в postgresql с расширением postgis. Я пытаюсь создать триггерную функцию, которая обновляет геометрический столбец geom (Linestring) в table_2 всякий раз, когда я вставляю или обновляю site_a, site_b в нем. Эти последние столбцы являются внешними ключами, ссылающимися на код_сайта в таблице_1.

таблица_1:

 site_code |                        geom
-----------+----------------------------------------------------
 MIT03     | 0101000020E61000009B55BFC8CDF8174054483DD5C9254240
 BAS33     | 0101000020E6100000345EEA4A00A61A4095FAE019BDDD4140

таблица_2:

 link_id | site_a | site_b | geom
---------+--------+--------+------
      72 | BAS33  | MIT03  |
      57 | AI4402 | MIT03  |

Вот моя функция:

CREATE OR REPLACE FUNCTION create_line() RETURNS TRIGGER
AS
$$
BEGIN
UPDATE links SET geom =ST_MakeLine((SELECT sites.geom FROM links JOIN sites ON site_code=NEW.site_a),(SELECT sites.geom FROM links JOIN sites ON site_code=NEW.site_b)) WHERE link_id=NEW.link_id;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;

И триггер:

CREATE TRIGGER t_create_line
AFTER INSERT OR UPDATE OF site_a, site_b
ON links
FOR EACH ROW
EXECUTE PROCEDURE create_line();

Я не могу заставить эту функцию работать.

1 Ответ

0 голосов
/ 05 апреля 2020

Мне удалось заставить функцию работать, проблема возникла из запросов SELECT внутри ST_MakeLine; оба вернули много строк. Путем добавления LIMIT 1

(SELECT sites.geom FROM links JOIN sites ON site_code=site_a WHERE site_a=NEW.site_a LIMIT 1),(SELECT sites.geom FROM links JOIN sites ON site_code=site_b WHERE site_b=NEW.site_b LIMIT 1))

проблема была частично решена, так как функция обновила все строки в table_2. В конце обновления добавлено условие WHERE link_id=NEW.link_id, и теперь все в порядке.

...