触发器功能不会更新表的第一行

时间:2016-07-29 13:28:24

标签: postgresql triggers gis

我在PostgreSQL 9.5中工作,我有这两个表:

事件

  oid integer 
  description integer,
  geom geometry(Point,4326),

网格

  oid integer,
  number integer,
  geom geometry(Polygon,4326)

每次将一个点添加到表事件时,我希望字段 description 填充该点相交的网格编号。为此,我创建了这个触发器:

CREATE OR REPLACE FUNCTION get_ortofoto_incidentes()
  RETURNS TRIGGER AS
$BODY$
   BEGIN      
       SELECT g.number INTO NEW.description 
       FROM incident AS i, grid AS g 
       WHERE st_intersects(new.geom, g.geom) ; -- 
RETURN NEW;
   END;
$BODY$
   LANGUAGE 'plpgsq;

并将其添加到表事件

CREATE TRIGGER get_ortofoto_incidentes
  BEFORE INSERT OR UPDATE ON incidentestest  
  FOR each row
  EXECUTE PROCEDURE get_ortofoto_incidentes();

问题在于,当调用触发器函数时,属性 description 对于第一行保持为null,但在触发器按预期工作之后。这就是我得到的:

oid | description
 1  |  null
 2  | 236541
 3  | 695489
 4  | 325687
... |  ....

知道为什么触发器没有为表的第一行更新?

谢谢

1 个答案:

答案 0 :(得分:1)

我说这只是第一次插入行发生的巧合。如果description中的第一个匹配行在NULL中有grid,则NULL完全可以设置为number

我还想提醒您,触发器函数中的查询在grid和表incident的匹配行之间构建了一个笛卡尔积,因为没有WHERE条件限制后者。从查询中删除incident AS i