【问题标题】:Using rules in postgresql to insert several rows在 postgresql 中使用规则插入多行
【发布时间】:2014-05-21 08:34:06
【问题描述】:

我需要使用规则插入几行。

我的问题是: 我画了一个 poligon 并保存在表 z0_poligono_corte 上,然后我使用规则来获取 z0_poligono_corte 中的多边形与其他表中的多边形之间的交集,但结果未插入到我创建的表中以保存结果。 postgres 日志中也没有错误。

CREATE RULE cortar_anp AS ON INSERT TO z0_poligono_corte 
DO also insert into z0_a_n_p_13 (id_poligono, folio, obs, anp, geometria) select pol.id, pol.folio, pol.obs, capa.anp, ST_Multi(ST_Intersection(capa.geom, pol.geometria))
from a_n_p_13 capa, z0_poligono_corte pol
where pol.id=NEW.id
and capa.geom && pol.geometria
and ST_IsEmpty(ST_Intersection(capa.geom, pol.geometria)) != TRUE;

我不知道我的规则是否正确。如果我使用例如 pol.id=1 运行插入到句子中,那么结果将正确保存。 图片

我没有 10 名声望来放图片 :(

图片在这里

谢谢。

【问题讨论】:

  • 您当前的规则将尝试插入根据所有现有记录选择的记录(包括正在插入的新记录)。如果您只想在z0_a_n_p_13 中插入与插入到z0_poligono_corte 的记录相对应的记录,请使用new 而不是z0_poligono_corte pol
  • like this: CREATE RULE cortar_anp AS ON INSERT TO z0_poligono_corte DO 也插入 z0_a_n_p_13 (id_poligono, folio, obs, anp, geometria) 选择 new.id, new.folio, new.obs, capa。 anp, ST_Multi(ST_Intersection(capa.geom, new.geometria)) 来自 a_n_p_13 capa, NEW where capa.geom && pol.geometria and ST_IsEmpty(ST_Intersection(capa.geom, new.geometria)) != TRUE;但说新关系不存在。 @ADTC
  • capa.geom && pol.geometria AND ST_IsEmpty(ST_Intersection(capa.geom, pol.geometria)) != TRUE 是一种非常复杂的询问它们是否相交的方法。大大简化为ST_Intersects(capa.geom, pol.geometria)
  • 请查看Postgres Docs about Rules 以了解如何正确使用NEWOLD 伪关系,以及它们的用途。

标签: postgresql postgis rules


【解决方案1】:

以下是如何解决我的触发器问题。 首先我创建了一个表

    CREATE TABLE public.z0_poligono_corte (   
id serial,   
nombre character varying(255),   
giro text,   
geometria geometry(MultiPolygon,32614),   
CONSTRAINT z0_poligono_corte_pkey PRIMARY KEY (id) )

之后我创建了一个触发函数来制作切片

    CREATE OR REPLACE FUNCTION public.cortes_interseccion_amias()
      RETURNS trigger AS
    $BODY$
    declare var_sql text;
    begin
        var_sql :=  'insert into z0_amias08 (id_poligono, nombre, giro, tipo, geometria) 
select pol.id, pol.nombre, pol.giro, capa.tipo, ST_Intersection(capa.geom, pol.geometria)
    from amias08 capa, z0_poligono_corte pol
    where pol.id=$1
    and capa.geom && pol.geometria
    and ST_IsEmpty(ST_Intersection(capa.geom, pol.geometria)) != TRUE';
        execute var_sql using NEW.id;
        return NEW;
    end;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;

然后是触发器。

CREATE TRIGGER interseccion_amias
  AFTER INSERT
  ON public.z0_poligono_corte
  FOR EACH ROW
  EXECUTE PROCEDURE public.cortes_interseccion_amias();

所以当我在那个表上插入一个多边形时,触发函数会在有数据的表上剪切,然后在新表上插入

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    相关资源
    最近更新 更多