【问题标题】:Updating multiple records in multiple tables using trigger使用触发器更新多个表中的多条记录
【发布时间】:2014-12-20 13:36:52
【问题描述】:

我正在尝试在 postgres 中编写一个触发器函数,当向表中添加一条记录时,它将更新多个其他表中的多条记录。

例如,我有架构“调查”和一个名为“a_household”的表。

在此架构中,有多个表具有引用家庭表 ID 的字段“hh_id”。

如果表的其他属性匹配,所有这些表的 hh_id 仅引用家庭表的 id。

目前我失败的编码看起来像:

DECLARE
  tables text[] = ARRAY['b_member','f_firewood'];
  table_name text;
  r record;
BEGIN
  FOREACH table_name IN ARRAY tables
  LOOP        
    INSERT INTO survey.table_name(hh_id) values (NEW.id)
    SELECT * FROM survey.table_name
    WHERE survey.table_name.a= NEW.b; 
  END LOOP;
END;

我完全失败了 - 感谢任何建议。

我的第二次尝试(阅读下面的回复后)是:

DECLARE
  tables text[] = ARRAY['b_member'];
  table_name text; 

BEGIN

if tg_op='INSERT' then

FOREACH table_name IN ARRAY tables
  LOOP      
  EXECUTE 'UPDATE ' || 'survey.' || table_name || ' SET hh_id = '||NEW.id||' FROM household.a_household WHERE (select survey.b_member.odk_parentkey from survey.b_member
      where survey.b_member.odk_key = "'||NEW.odk_key||'");';

  END LOOP;

end if;

return new;

END; 

但我收到了错误消息'列'hgd'不存在。这是 NEW.odk_key 的值 贝基

【问题讨论】:

    标签: postgresql triggers


    【解决方案1】:
    CREATE OR REPLACE FUNCTION survey.insert_in_other_tables()
      RETURNS trigger AS
    $BODY$
    declare tables text[] = ARRAY['b_member','f_firewood'];
    table_name text; 
    
    BEGIN
    
    if tg_op='INSERT' then
    
    FOREACH table_name IN ARRAY tables
      LOOP      
      EXECUTE 'INSERT INTO ' || 'survey.' || table_name || '(hh_id) values ('||NEW.id||');';
      END LOOP;
    
    end if;
    
    return new;
    
    end;$BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-08
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      相关资源
      最近更新 更多