У меня есть две таблицы, представляющие два разных типа изображений.Я использую PostGIS для представления границ этих изображений.Вот упрощенный пример этих таблиц:
CREATE TABLE img_format_a (
id SERIAL PRIMARY KEY,
file_path VARCHAR(1000),
boundary GEOGRAPHY(POLYGON, 4326)
);
CREATE TABLE img_format_p (
id SERIAL PRIMARY KEY,
file_path VARCHAR(1000),
boundary GEOGRAPHY(POLYGON, 4326)
);
У меня также есть таблица перекрестных ссылок, в которую я хочу включить все идентификаторы изображений, которые перекрывают друг друга.Всякий раз, когда изображение типа «A» вставляется в базу данных, я хочу проверить, не перекрывает ли оно какое-либо из существующих изображений типа «P» (и наоборот), и вставить соответствующие записи в таблицу перекрестных ссылок img_a_img_p
.,Эта таблица должна представлять отношение «многие ко многим».
Мой первый инстинкт - написать триггер для управления этой таблицей img_a_img_p
.Я никогда раньше не создавал триггера, поэтому дайте мне знать, если это глупо, но мне кажется, что это имеет смысл.Поэтому я создаю следующий триггер:
CREATE TRIGGER update_a_p_cross_reference
AFTER INSERT OR DELETE OR UPDATE OF boundary
ON img_format_p FOR EACH ROW
EXECUTE PROCEDURE check_p_cross_reference();
Часть, в которой я застреваю - это написание функции триггера.Мой код написан на Java, и я вижу, что есть такие инструменты, как PL / pgSQL, но я не уверен, что это то, что я должен использовать, или мне даже нужна одна из этих специальных надстроек.
По существу всеМне нужен триггер, чтобы обновлять таблицу перекрестных ссылок каждый раз, когда новое изображение вставляется в img_format_a
или img_format_p
.Когда вставляется новое изображение, я хотел бы использовать функцию PostGIS, например ST_Intersects
, чтобы определить, перекрывает ли новое изображение какое-либо из изображений в другой таблице.Для каждой пары изображений, где ST_INTERSECTS
возвращает true, я хотел бы вставить новую запись в img_a_img_p
с идентификаторами обоих изображений.Может кто-нибудь помочь мне понять, как написать эту функцию триггера?Вот некоторый псевдокод:
SELECT * FROM img_format_p P
WHERE ST_Intersects(A.boundary, P.boundary);
for each match in selection {
INSERT INTO img_a_img_p VALUES (A.id, P.id);
}