【问题标题】:PostgreSQL update trigger: relation 'new' does not existPostgreSQL 更新触发器:关系“新”不存在
【发布时间】:2021-09-01 22:27:17
【问题描述】:

我试图更好地了解触发器,但不太理解为什么我无法在此触发器函数定义中引用新的传入行:

    CREATE OR REPLACE FUNCTION public.update_origin_country()
    RETURNS TRIGGER
    LANGUAGE plpgsql
    AS $$
    BEGIN
            NEW.origin_country = a.pk 
            from reference.admin_layers_0 a 
            inner join reference.world_port_index b on a.iso_a2 = b.country 
            inner join new c on b.id = c.origin_port;
            RETURN NEW;
    END;
    $$;
    
    CREATE TRIGGER "origin_country_update" BEFORE INSERT OR UPDATE OF "origin_port" ON "active"."events"
    FOR EACH ROW
    EXECUTE PROCEDURE "public"."update_origin_country"();

当我使用触发器更新字段 origin_ports 时,我收到错误:

关系“新”不存在。

不知道如何绕过它。目标是评估传入的新行,检查 origin_ports 中的值,并使用该值从引用端口表和国家名称表的查询中更新 origin_country 的值。任何帮助表示赞赏。

【问题讨论】:

  • 您正在尝试将inner join 转至newnew 是单个记录,而不是表/关系。
  • NEWrecord 不是关系(表),您不能在 JOIN 中使用它。我会说消除inner join new c on b.id = c.origin_port; 并改用WHERE b.id = new.origin_port
  • 好的,感谢您的澄清!随意写下来作为答案,以便我接受。

标签: postgresql triggers


【解决方案1】:

我不完全理解所需的逻辑,但不是加入new(这是无效的,因为新行不是关系/表),您可以将过滤器添加到 where 子句,例如:

 CREATE OR REPLACE FUNCTION public.update_origin_country()
    RETURNS TRIGGER
    LANGUAGE plpgsql
    AS $$
    BEGIN
            NEW.origin_country = a.pk 
            from reference.admin_layers_0 a 
            inner join reference.world_port_index b on a.iso_a2 = b.country 
            WHERE new.origin_port = b.id;
            RETURN NEW;
    END;
    $$;
    
    CREATE TRIGGER "origin_country_update" BEFORE INSERT OR UPDATE OF "origin_port" ON "active"."events"
    FOR EACH ROW
    EXECUTE PROCEDURE "public"."update_origin_country"();

这是你想要的吗?

【讨论】:

  • 我觉得写SELECT a.pk INTO NEW.origin_country FROM ...更易读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
相关资源
最近更新 更多