【问题标题】:Trigger function does not update the first row of the table触发函数不更新表的第一行
【发布时间】:2016-07-29 13:28:24
【问题描述】:

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

事件

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

和表网格

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

每次将一个点添加到表 incident 我希望字段 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 的第一行仍然为空,但在触发器按预期工作之后。这就是我得到的:

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

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

谢谢

【问题讨论】:

    标签: postgresql triggers gis


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 Laurenz,incident AS i 的好点子。我删除了它,现在触发器即使在第一行也能按预期工作。虽然我理解你的观点,但我不确定它为什么会导致我的问题,但事实是,它有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多