postgresql - 使用触发器将最后一行字段值复制到另一个列表
问题描述
我正在使用触发器在 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”表中 - 不仅是最后一行,有什么线索吗?谢谢
解决方案
这是一个示例 - 您只需使用所需的表名和列名调整您的 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();
推荐阅读
- vue.js - Vuepress - 将组件添加到每个页面
- python - 如何将每个基于芹菜类的任务保存在 django 项目中的单独文件中?
- php - 如何在“添加到购物车”提交时验证可变产品上的自定义字段
- lettuce - Lettuce Redis 客户端不平衡从服务器之间的负载
- c++ - 在 Qt 中创建用户表
- python - 无法使用 django 模型将图像文件路径存储在数据库中。
- postgresql - Kubernetes postgres 中持久卷的权限问题
- html - 如何使用 CSS3 或 VanillaJS 为 SVG 动画中的时钟效果制作圆形动画?
- python - 如何在tkinter中将两个窗口堆叠在一起
- javascript - 在 JavaScript、Mocha 和 Chai 中测试类函数