使用触发器更新多个表中的多个记录

时间:2014-10-24 16:50:33

标签: postgresql triggers

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

例如,我有架构'调查'还有一张名为' a_household'。

的表格

在此架构中,有多个表格包含字段' hh_id'引用家庭表的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的值 贝基

1 个答案:

答案 0 :(得分: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;