sql >> データベース >  >> RDS >> PostgreSQL

Postgres-インサートでST_SetSRID(ST_MakePoint(lng、lat)、4326)を自動的に呼び出す方法は?

    これは、トリガーを使用して行うことができます。挿入呼び出しはジオメトリを処理せず、緯度経度およびその他の非空間フィールドのみを処理し、トリガー関数がジオメトリを作成します。行を更新するときも同じことを忘れないでください。トリガー関数に追加の動的パラメーターを渡すことはできないため、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();
    


    1. MySQLでのラグ関数のシミュレーション

    2. MS SQL Serverで「INSERTINTO」スクリプトを生成するための無料のツールはありますか?

    3. AWS RDSでのMySQLからPostgreSQLへの移行、パート1

    4. 複数の列の値が同じであるMySQLテーブルがある場合、最新の2つを除くすべてのエントリを削除するにはどうすればよいですか?