簡體   English   中英

如何創建從一個表更新另一個表中的更改的函數?

[英]How to create function that updates changes in one table from another table?

我有在這里找到的此功能:

插入觸發器以使用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';

table2中沒有任何反應。

如何創建一個更新表中更改的函數?

要支持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;
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;

這將應用於所有記錄,而不僅是更新的記錄。

如果U僅要更新/插入一條記錄,則創建觸發器,將每一行的new引用為new

並使用:new.id:new.name在t2中查找所需的記錄。

感謝大家的幫助。 這是對我有用的答案。 我從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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM