Хорошо, это интересно. Я новичок в триггерах (как вы, возможно, заметили ^^), поэтому кажется, что когда я воссоздаю таблицу ПОСЛЕ Я создал триггер для этой таблицы, триггер не работает.Он просто возвращает ноль для соответствующих столбцов.
Когда я придерживаюсь правильного порядка, я заставляю его работать с моим образцом воспроизведения вашего дела:
CREATE TABLE so_postgres
(n text,
r text,
c text,
rent_avg numeric,
food_avg numeric,
transport_avg numeric,
latitude numeric,
longitude numeric,
geog geography
);
INSERT INTO so_postgres
VALUES ('Möhringen', 'central europe', 'germany', 200.45, 56.45, 4.56, 48.725866,
9.146131, ST_SetSRID(ST_Point(9.146131, 48.725866), 4326)),
('Vaihingen', 'central europe', 'germany', 155.33, 44.12, 2.78, 48.732550,
9.108291, ST_SetSRID(ST_Point(9.108291, 48.732550), 4326)),
('Sigmaringen', 'central europe', 'germany', 298.11, 59.67, 1.99, 48.090797,
9.230243, ST_SetSRID(ST_Point(9.230243, 48.090797), 4326));
CREATE OR REPLACE FUNCTION fn_cities_geo_update_event() RETURNS trigger AS $fn_cities_geo_update_event$
BEGIN
NEW.geog := (ST_SetSRID(ST_MakePoint(NEW.longitude,NEW.latitude), 4326)::geography);
if NEW.rent_avg IS null then
NEW.rent_avg := (
SELECT round(avg(a.rent_avg), 2)
FROM so_postgres as a
WHERE ST_DWithin(a.geog, NEW.geog, 50000)
);
end if;
RETURN NEW;
END;
$fn_cities_geo_update_event$ LANGUAGE plpgsql;
CREATE TRIGGER fn_cities_geo_update_event BEFORE INSERT OR UPDATE ON so_postgres FOR EACH ROW EXECUTE PROCEDURE fn_cities_geo_update_event();
INSERT INTO so_postgres (n, r, c, latitude, longitude)
VALUES ('Degerloch', 'central europe', 'germany', 48.725866, 9.146131);
n | r | c | rent_avg | food_avg | transport_avg | latitude | longitude | geog
-------------+----------------+---------+----------+----------+---------------+-----------+-----------+----------------------------------------------------
Möhringen | central europe | germany | 200.45 | 56.45 | 4.56 | 48.725866 | 9.146131 | 0101000020E610000012DDB3AED14A2240A1A3552DE95C4840
Vaihingen | central europe | germany | 155.33 | 44.12 | 2.78 | 48.732550 | 9.108291 | 0101000020E6100000FBE6FEEA71372240A857CA32C45D4840
Sigmaringen | central europe | germany | 298.11 | 59.67 | 1.99 | 48.090797 | 9.230243 | 0101000020E61000000F441669E275224097C9703C9F0B4840
Degerloch | central europe | germany | 177.89 | | | 48.725866 | 9.146131 | 0101000020E610000012DDB3AED14A2240A1A3552DE95C4840
Чтобы ответить на ваш последний комментарий: я добавляю ST_DWithin
костальная часть запроса через WHERE
-clause.
Это у вас работает?