【发布时间】:2013-06-04 20:39:01
【问题描述】:
我有一个表规则,它只检查新条目是否与名称匹配,并使用 postgis 库中的 st_intersects 与匹配的现有行相交。
似乎只有一部分没有插入,但大多数都通过了这个规则。我在插入后手动检查了一些条目,可以确认规则应该阻止了该插入。
我的规则有问题吗?
表格有 3 列。 id serial、name varchar(200) 和 way geometry(Linestring,4326)
我的规则如下(摘自\d名称)
blockduplicate AS
ON INSERT TO nameslist
WHERE (EXISTS ( SELECT 1
FROM nameslist
WHERE nameslist.name::text = new.name::text AND st_intersects(nameslist.way, new.way) = true)) DO INSTEAD NOTHING
这个表只取一行有名字的行,每当另一个同名的条目进入并与另一个同名的现有条目相交时,它应该被阻止。所以我在几何字段方式表示的区域中只有一个具有此名称的条目。插入后,我看到很多重复项(名称匹配,st_intersects 在检查way 字段时返回true)。为什么我的规则没有阻止插入?
更新:是不是因为我在一个查询中进行了多次插入。实际上,我使用查询INSERT INTO (a,b,c) VALUES (...),(...),(...),... 一次性插入了 12000 个条目
PostgreSQL 是否为每个值调用规则?我需要进行多次插入,否则完成插入需要几个月的时间。
【问题讨论】:
-
在 PostgreSQL 中,规则不是触发器。规则重写语句并执行修改后的语句。因此,问题是“每个值都需要规则吗?”没有意义,因为答案是:取决于 exact 规则和 exact 语句。因此,在我看来,您在规则上遇到了通常的弱点:对于简单的语句(即在您自己的测试时),它们按预期工作,但并非适用于所有语句。后面的语句是您在调试实际应用程序和某人 梦寐以求的查询之前不会想到的语句。 ;-)
-
使用触发器而不是规则,你会避免很多困惑和挫折。
-
无论出于何种原因,我的插入现在似乎都可以使用触发器。但它slooooow。现在需要三倍的时间来插入我的数据。感谢您的信息。
标签: postgresql gis rule