使用postgreSQL中的触发器将数据从一个表移动到另一个表



当其中一列的值更新时,我需要将数据从一个表移动到另一个表。我只想将更新后的行移到新表中。

下面是我写的触发器。我的代码的问题是,它移动的是所有数据,而不仅仅是更新的行。有人能提个建议吗?

create or replace function moveToAC1ControlHist() 
returns trigger as $$ 
begin if NEW.file_status='CO' 
then
insert into ac1_control_hist (file_status,identitifier) 
(
select file_status,identitifier      
from
ac1_control where new.FILE_STATUS = 'CO'
);
end if;
return new;
end;
$$ language plpgsql;

create  TRIGGER AC1_CONTROL_TRIGGER AFTER update of file_status ON AC1_CONTROL
FOR EACH ROW when (new.file_status ='CO')EXECUTE PROCEDURE moveToAC1ControlHist();

我认为您想要的逻辑是:

create or replace function moveToAC1ControlHist() 
returns trigger as 
$$ 
begin
insert into ac1_control_hist (file_status,identitifier) 
values (new.file_status, new.identitifier);
return null;
end;
$$ language plpgsql;
create trigger ac1_control_trigger 
after update of file_status on ac1_control
for each row 
when (new.file_status ='co')
execute function movetoac1controlhist()
;

理由:

  • 您只想复制(部分(正在更新的行,因此不需要select;您可以使用行级触发器中的new访问当前行的值

  • 触发器定义过滤等于'CO'的新file_status,因此在函数中不需要if构造

  • 这是一个after触发器,所以您可以只返回null-结果无论如何都会被丢弃

相关内容

最新更新