如何创建更新一个表中来自另一个表的更改的函数?

时间:2016-03-24 13:39:42

标签: sql postgresql

我在这里找到了这个功能:

Insert trigger to Update another table using PostgreSQL

CREATE TABLE table1
(
  id integer NOT NULL,
  name character varying,
  CONSTRAINT table1_pkey PRIMARY KEY (id)
)

CREATE TABLE table2
(
  id integer NOT NULL,
  name character varying
)
CREATE OR REPLACE FUNCTION function_copy() RETURNS TRIGGER AS
$BODY$
BEGIN
    INSERT INTO
        table2(id,name)
        VALUES(new.id,new.name);

           RETURN new;
END;
$BODY$
language plpgsql;

CREATE TRIGGER trig_copy
     AFTER INSERT ON table1
     FOR EACH ROW
     EXECUTE PROCEDURE function_copy();

如果我插入这两行:

insert into table1 values (1, 'Andrey');
insert into table1 values (2, 'Mariza');

然后他们也进入table2。

我的问题是当我对某个值进行更新时:

update table1 set name = 'Andi' where id = '1';

表2中没有任何反应。

如何创建更新表中更改的函数?

3 个答案:

答案 0 :(得分:1)

要支持UPDATE,您可以这样做:

触发:

CREATE TRIGGER trig_copy
     AFTER INSERT OR UPDATE ON table1
     FOR EACH ROW
     EXECUTE PROCEDURE function_copy();

功能:

CREATE OR REPLACE FUNCTION function_copy() RETURNS TRIGGER AS
$BODY$
BEGIN
    if TG_OP='INSERT' then
       INSERT INTO table2(id,name) VALUES(new.id,new.name);
    end if;
    if TG_OP='UPDATE' then
        Update table2 set name=new.name where id=old.id;
    end if;
    RETURN new;
END;
$BODY$
language plpgsql;

答案 1 :(得分:1)

create or replace trigger trig_copy
  after insert or update
  on table1
begin
  merge into table2 t2
      using (
        select 
          id,
          name
        from
          table1 t1) t_new
        on (t2.id = t_new.id)
        when matched then
        update
        set
          t2.name = t_new.name
        where
          t2.id = t_new.id
        WHEN NOT MATCHED then
        insert (id,name) values(t_new.id,t_new.name);
end;

这将适用于所有记录,而不仅仅是更新记录。

如果你想更新/只插入一条记录创建触发器  引用新的新的   每行

并使用:new.id:new.name,在t2中找到你想要的记录。

答案 2 :(得分:0)

感谢所有人的帮助。这是对我有用的答案。 我从Elads和Justas解决方案中获取了它:

CREATE TRIGGER trig_copy
     AFTER INSERT OR UPDATE ON table1
     FOR EACH ROW
     EXECUTE PROCEDURE function_copy();

CREATE OR REPLACE FUNCTION function_copy() RETURNS TRIGGER AS
$BODY$
BEGIN
if TG_OP='INSERT' then
    INSERT INTO table2
  (SELECT * FROM table1
   WHERE id NOT IN
       (SELECT id FROM table2));
   end if;
 if TG_OP='UPDATE' then
        Update table2 set name=new.name where id=old.id;
    end if;
    RETURN new;
end;
$BODY$
language plpgsql;