PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Postgres - Làm cách nào để tự động gọi ST_SetSRID (ST_MakePoint (lng, lat), 4326) trên chèn?

Bạn có thể làm điều này bằng cách sử dụng một trình kích hoạt. Lệnh gọi chèn của bạn sẽ không xử lý hình học, chỉ với độ dài vĩ độ và các trường phi không gian khác, và hàm kích hoạt sẽ tạo hình dạng. Đừng quên thực hiện tương tự khi cập nhật hàng. Lưu ý rằng tôi đã mã hóa cứng SRID vì không thể chuyển các tham số động bổ sung cho hàm kích hoạt. Nếu cần, hãy thêm một trường vào bảng của bạn để giữ giá trị này và bạn có thể gọi nó là 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ngày và giờ theo giờ UTC - làm cách nào để lưu trữ chúng trong bưu điện?

  2. Chuyển đổi chuỗi hex sang bigint trong Postgres

  3. Rails tất cả người dùng trong một nhóm có giới tính nam

  4. django - tổng hợp các khóa cụ thể của trường json và thứ tự theo tổng hợp

  5. Nhận khóa được tạo tự động từ việc chèn hàng trong Spring 3 / PostgreSQL 8.4.9