sql >> Databáze >  >> RDS >> PostgreSQL

Postgres – Jak automaticky volat ST_SetSRID(ST_MakePoint(lng, lat), 4326) na vložkách?

Můžete to udělat pomocí spouštěče. Vaše volání insert by se nezabývalo geometrií, pouze šířkovou délkou a dalšími neprostorovými poli a spouštěcí funkce vytvoří geometrii. Nezapomeňme na totéž při aktualizaci řádku. Všimněte si, že jsem napevno zakódoval SRID, protože není možné předávat extra dynamické parametry spouštěcí funkci. V případě potřeby přidejte do tabulky pole, které bude obsahovat tuto hodnotu, a můžete na ni odkazovat jako 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();


  1. Vytvořte spouštěč pro smazání řádků, které jsou starší než 90 dní

  2. Je na vině MySQL, že dostáváte chyby duplicitních záznamů z Hibernate?

  3. Převod H2 dat do PostgreSQL

  4. Přidejte primární klíč s automatickým přírůstkem do existující tabulky v oracle