首页 > 解决方案 > 使用触发器将最后一行字段值复制到另一个列表

问题描述

我正在使用触发器在 PostgreSQL 中工作。我这里有 2 张桌子,invoice_items 和 invoice。从系统中插入表“发票”数据,然后使用触发器填充表“发票项目”以从“发票”表的插入数据中获取值。来自系统系统的每个插入都由两行组成,如下所示:

表'发票':

id       invoice_date     statement  amount
 1        2018-10-03       Insert      5
 2        2018-10-03       Update      6

然后在触发发票数据后插入表'invoice_items':

id         total     statement
 1           5         Insert
 2           6         Update

扳机:

create trigger do_fetch
    after insert
    on invoices
    for each row
    execute procedure insert_amount();

函数插入量():

create function insert_amount()
  returns trigger
language plpgsql
as $$
BEGIN
  INSERT INTO invoice_items (total, statement) VALUES (new.amount, new.statement);
return null;
END;

$$;

但我只想获取最后插入的“发票”数据来触发“发票项目”以达到这样的结果:

id       invoice_date     statement  amount
 1        2018-10-03       Insert      5
 2        2018-10-03       Update      6



id         total     statement
 1           6         Update

我试图将触发器编辑为此:

create constraint trigger do_fetch
        after insert
        on invoices
        deferrable
        for each row
        execute procedure insert_amount();

但我仍然将 2 行插入到“invoice_items”表中 - 不仅是最后一行,有什么线索吗?谢谢

标签: postgresql

解决方案


这是一个示例 - 您只需使用所需的表名和列名调整您的 sql:

test=# create table bla1(ts timestamp, content text);
CREATE TABLE
test=*# create table bla1_log(ts timestamp, content text);
CREATE TABLE
test=*# create or replace function trg_bla1() returns trigger as $$begin insert into 
bla1_log values (new.ts, new.content); return new; end; $$language plpgsql;
CREATE FUNCTION
test=*# create trigger trg1 after insert on bla1 for each row when (NEW.content = 
'Update') execute procedure trg_bla1();
CREATE TRIGGER
test=*# insert into bla1 values (now(), 'bla');
INSERT 0 1
test=*# commit;
COMMIT
test=# insert into bla1 values (now(), 'Insert');
INSERT 0 1
test=*# commit;
COMMIT
test=# insert into bla1 values (now(), 'Update');
INSERT 0 1
test=*# select * from bla1;

ts | 内容

----------------------------+---------

2018-11-08 12:32:28.803439 | 布拉

2018-11-08 12:33:30.355516 | 插入

2018-11-08 12:33:38.451548 | 更新

(3 行)

 test=*# select * from bla1_log ;

ts | 内容

----------------------------+---------

2018-11-08 12:33:38.451548 | 更新

(1 行)

 test=*#

编辑:

由于您没有回复并努力根据我的回答调整您的代码,我不确定这是否值得我花时间 - 但这里应该适合您..

 create table invoice(id serial, invoice_date text, statement text, amount integer);


 create table invoice_items(id serial, total integer, statement text);


 create or replace function insert_amount() returns trigger as $$begin 
 insert into invoice_items values (id, total, statement); return new; end; 


 create trigger mytrigger after insert on invoice for each row when (NEW.statement = 'Update') execute procedure insert_amount();

推荐阅读