Можете да направите това с помощта на спусък. Вашето извикване за вмъкване няма да се занимава с геометрията, а само с lat-long и други непространствени полета, а тригерната функция ще създаде геометрията. Нека не забравяме да направим същото, когато актуализираме реда. Имайте предвид, че съм кодирал твърдо SRID, тъй като не е възможно да предам допълнителни динамични параметри на функцията за задействане. Ако е необходимо, добавете поле към вашата таблица, за да задържите тази стойност и можете да я наричате new.srid
CREATE OR REPLACE FUNCTION markers_geog_tg_fn() RETURNS trigger AS
$BODY$BEGIN
IF TG_OP = 'INSERT' AND (NEW.lat ISNULL or NEW.lng ISNULL ) THEN
RETURN NEW; -- no geometry
ELSIF TG_OP = 'UPDATE' THEN
--Lat Long updated to null, erase geometry
IF NEW.lat ISNULL or NEW.lng ISNULL THEN
NEW.geography = NULL;
END IF;
IF NEW.lat IS NOT DISTINCT FROM OLD.lat and NEW.lng IS NOT DISTINCT FROM OLD.lng THEN
RETURN NEW; -- same old geometry
END IF;
END IF;
-- Attempt to transform a geometry
BEGIN
NEW.geography := ST_SetSRID(ST_MakePoint(NEW.lng::decimal, NEW.lat::decimal), 4326))
EXCEPTION WHEN SQLSTATE 'XX000' THEN
RAISE WARNING 'geography not updated: %', SQLERRM;
END;
RETURN NEW;
END;$BODY$ LANGUAGE plpgsql;
CREATE TRIGGER markers_geog_tg BEFORE INSERT OR UPDATE
ON markers FOR EACH ROW
EXECUTE PROCEDURE markers_geog_tg_fn();