sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres - Hur anropar man automatiskt ST_SetSRID(ST_MakePoint(lng, lat), 4326) på inlägg?

Du kan göra detta genom att använda en trigger. Ditt infogningsanrop skulle inte behandla geometrin, bara med lat-long och andra icke-spatiala fält, och triggerfunktionen kommer att skapa geometrin. Låt oss inte glömma att göra detsamma när vi uppdaterar raden. Notera att jag har hårdkodat SRID eftersom det inte är möjligt att skicka extra dynamiska parametrar till triggerfunktionen. Om det behövs, lägg till ett fält i tabellen för att hålla detta värde och du kan referera till det som 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. Ytterligare ett 12c Optimizer-vitbok

  2. Eliminera dubbletter av värden baserat på endast en kolumn i tabellen

  3. Upprepade kalenderhändelser och lite avslutande matematik

  4. Använda Inner Join för att bestämma intervallet mellan specifika poster och relaterade händelser i en tabell