Postgresql 如何基于多边形在表中创建空间约束?

Postgresql 如何基于多边形在表中创建空间约束?,postgresql,constraints,postgis,spatial,Postgresql,Constraints,Postgis,Spatial,我有一张桌子,可以收集一定区域内的一些测量值。我知道创建此验证的触发器,但我正在寻找更简单的方法,因为我需要验证记录的区域是一个多边形 以下是我的表格的简化版本: CREATE TABLE measurements ( m_time timestamp, temperature int, geom geometry (point,4326) ); 所有插入的记录必须位于以下多边形的内部 POLYGON((-35.32 -7.96,-35.27 -7.96,-35.27 -8.01,

我有一张桌子,可以收集一定区域内的一些测量值。我知道创建此验证的触发器,但我正在寻找更简单的方法,因为我需要验证记录的区域是一个多边形

以下是我的表格的简化版本:

CREATE TABLE measurements (
  m_time timestamp,
  temperature int,
  geom geometry (point,4326)
);
所有插入的记录必须位于以下多边形的内部

POLYGON((-35.32 -7.96,-35.27 -7.96,-35.27 -8.01,-35.32 -8.01,-35.32 -7.96))
一些示例数据:

INSERT INTO measurements VALUES 
  ('2020-06-26 13:30:08',31,'SRID=4326;POINT(-35.29 -7.98)'),
  ('2020-06-26 12:27:42',34,'SRID=4326;POINT(-35.29 -7.99)'),
  ('2020-06-26 12:27:42',34,'SRID=4326;POINT(-35.35 -8.0)'); -- this point lies outside of the polygon
如何在插入之前验证记录而不使用触发器?

欢迎使用SO

最简单的方法是使用您的多边形的空间函数向表中添加约束,例如:

ALTER TABLE measurements 
  ADD CONSTRAINT check_location 
  CHECK(
    ST_Contains('SRID=4326;POLYGON((-35.32 -7.96,-35.27 -7.96,-35.27 -8.01,-35.32 -8.01,-35.32 -7.96))',geom));
插入前两条记录将起作用:

INSERT INTO measurements VALUES 
  ('2020-06-26 13:30:08',31,'SRID=4326;POINT(-35.29 -7.98)'),
  ('2020-06-26 12:27:42',34,'SRID=4326;POINT(-35.29 -7.99)');

INSERT 0 2
但如果给定点位于多边形之外,则失败:

INSERT INTO measurements VALUES 
  ('2020-06-26 12:27:42',34,'SRID=4326;POINT(-35.35 -8.0)'); 

ERROR:  new row for relation "measurements" violates check constraint "check_location"
DETAIL:  Failing row contains (2020-06-26 12:27:42, 34, 0101000020E6100000CDCCCCCCCCAC41C000000000000020C0).
进一步阅读:

欢迎来到SO

最简单的方法是使用您的多边形的空间函数向表中添加约束,例如:

ALTER TABLE measurements 
  ADD CONSTRAINT check_location 
  CHECK(
    ST_Contains('SRID=4326;POLYGON((-35.32 -7.96,-35.27 -7.96,-35.27 -8.01,-35.32 -8.01,-35.32 -7.96))',geom));
插入前两条记录将起作用:

INSERT INTO measurements VALUES 
  ('2020-06-26 13:30:08',31,'SRID=4326;POINT(-35.29 -7.98)'),
  ('2020-06-26 12:27:42',34,'SRID=4326;POINT(-35.29 -7.99)');

INSERT 0 2
但如果给定点位于多边形之外,则失败:

INSERT INTO measurements VALUES 
  ('2020-06-26 12:27:42',34,'SRID=4326;POINT(-35.35 -8.0)'); 

ERROR:  new row for relation "measurements" violates check constraint "check_location"
DETAIL:  Failing row contains (2020-06-26 12:27:42, 34, 0101000020E6100000CDCCCCCCCCAC41C000000000000020C0).
进一步阅读: