0

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

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

我的规则有问题吗?

表有 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返回)。为什么我的规则没有阻止插入?trueway

更新:是不是因为我在一个查询中进行了多次插入。我实际上在一次使用查询中插入了 12000 个条目INSERT INTO (a,b,c) VALUES (...),(...),(...),... PostgreSQL 是否为每个值调用规则?我需要进行多次插入,否则完成插入需要几个月的时间。

4

1 回答 1

0

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

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

  INSERT INTO nameslist
  SELECT * FROM nameslist_import;

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

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

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

希望这可以帮助。

于 2013-09-17T07:01:38.867 回答