【问题标题】:Postgres/GIS: RULE does not affect all insertsPostgres/GIS:规则不影响所有插入
【发布时间】:2013-06-04 20:39:01
【问题描述】:

我有一个表规则,它只检查新条目是否与名称匹配,并使用 postgis 库中的 st_intersects 与匹配的现有行相交。

似乎只有一部分没有插入,但大多数都通过了这个规则。我在插入后手动检查了一些条目,可以确认规则应该阻止了该插入。

我的规则有问题吗?

表格有 3 列。 id serialname 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


【解决方案1】:

好的,通常你会发现触发器比规则更清晰。每次插入都会触发触发器。规则是重写 SQL 的宏。使用规则是有时间和地点的,但它们肯定是一个高级领域。

让我们看看您的插入会发生什么。假设你:

  INSERT INTO nameslist
  SELECT * FROM nameslist_import;

您的规则实际上会将查询重写为:

  INSERT INTO nameslist
  SELECT * FROM nameslist_import WHERE not (expression modelled on your rule);

通常将其写入查询而不是使用规则为您重写查询更简洁。这使您可以准确地调整您想要在每个查询中执行的操作。如果您想防止此类数据重叠,请查看排除约束(如果它们适用或触发)。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2019-10-23
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多