我在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
... | ....
知道为什么触发器没有为表的第一行更新?
谢谢
答案 0 :(得分:1)
我说这只是第一次插入行发生的巧合。如果description
中的第一个匹配行在NULL
中有grid
,则NULL
完全可以设置为number
。
我还想提醒您,触发器函数中的查询在grid
和表incident
的匹配行之间构建了一个笛卡尔积,因为没有WHERE
条件限制后者。从查询中删除incident AS i
。