sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres - Hvordan kalder man automatisk ST_SetSRID(ST_MakePoint(lng, lat), 4326) på inserts?

Du kan gøre dette ved at bruge en trigger. Dit indsæt-kald vil ikke omhandle geometrien, kun med lat-lange og andre ikke-rumlige felter, og triggerfunktionen vil skabe geometrien. Lad os ikke glemme at gøre det samme, når du opdaterer rækken. Bemærk, at jeg har hardkodet SRID'et, da det ikke er muligt at sende ekstra dynamiske parametre til triggerfunktionen. Hvis det er nødvendigt, kan du tilføje et felt til din tabel for at indeholde denne værdi, og du kan henvise til 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. leverer certifikater til tomcat jndi-forbindelse til postgresql

  2. 6 måder at vælge duplikerede rækker i SQLite

  3. Angiv de konti, der er knyttet til en databasemail-profil i SQL Server

  4. Udskriver kolonnetitler i CSV-eksport