sql >> Database >  >> RDS >> PostgreSQL

Postgres - Hoe automatisch ST_SetSRID(ST_MakePoint(lng, lat), 4326) aanroepen op inserts?

U kunt dit doen door een trigger te gebruiken. Uw insert-aanroep zou de geometrie niet behandelen, alleen met lat-long en andere niet-ruimtelijke velden, en de triggerfunctie zal de geometrie creëren. Laten we niet vergeten hetzelfde te doen bij het bijwerken van de rij. Merk op dat ik de SRID hard heb gecodeerd, omdat het niet mogelijk is om extra dynamische parameters door te geven aan de triggerfunctie. Voeg indien nodig een veld toe aan uw tabel om deze waarde vast te houden en u kunt ernaar verwijzen als 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. Hoe te groeperen in SQL op grootste datum (Order By a Group By)

  2. MySQL krijgt de datum n dagen geleden als een tijdstempel

  3. Hoe maak je een unieke willekeurige integer-ID voor de primaire sleutel voor een tabel?

  4. Gegevens ophalen uit Mysql en converteren naar PHP-array