首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgresql 10 realizar触发器插入或更新

postgresql 10 realizar触发器插入或更新
EN

Stack Overflow用户
提问于 2020-09-08 16:48:38
回答 2查看 119关注 0票数 1

我有两个表,一个总线和另一个bus_tmp,在其中我需要更新或插入,我需要在总线表上设置一个触发器。两个表都有相同的字符。我对postgresql很陌生。:(如果是的话,我如何创建触发器?执行更新总线没有结果。)

更新表总线

代码语言:javascript
复制
UPDATE bus SET (patio_antes, patio_antes) = (SELECT patio_antes, patio_actual FROM bus_tmp
WHERE bus_tmp.interno = bus.interno)

Error = ERROR:多个赋值给同一列"patio_antes“Estado SQL: 42601

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-09 05:02:11

对于您的问题,我理解的是,您需要通过UPSERT上的触发器在bus表中使用bus_temp。因此,您应该在表bus_tempbus_temp事件上编写一个触发器,如下所示:

触发函数

代码语言:javascript
复制
create or replace function bus_update() returns trigger as $$
begin

insert into bus(interno, modelo, tipo, patente, anio, chasis, plazas, carroceria, patio_antes, patio_actual)
values(new.interno, new.modelo, new.tipo, new.patente, new.anio, new.chasis, new.plazas, new.carroceria, new.patio_antes, new.patio_actual)

on conflict (interno)
do update set
modelo=excluded.modelo, 
tipo=excluded.tipo, 
patente=excluded.patente, 
anio=excluded.anio, 
chasis=excluded.chasis, 
plazas=excluded.plazas, 
carroceria=excluded.carroceria, 
patio_antes=excluded.patio_antes, 
patio_actual=excluded.patio_actual;

return new;
end;
$$
language plpgsql;

触发器

代码语言:javascript
复制
CREATE TRIGGER  
trg_bus_update  
After INSERT OR UPDATE ON 
bus_temp FOR EACH ROW EXECUTE PROCEDURE bus_update(); 

上面会做你在问题中提到的事情。

演示

票数 0
EN

Stack Overflow用户

发布于 2020-09-08 23:39:59

我想你想

代码语言:javascript
复制
UPDATE bus SET (patio_antes, patio_actual) = (SELECT patio_antes, patio_actual FROM bus_tmp
WHERE bus_tmp.interno = bus.interno);

当前的查询试图一次将patio_antes设置为两个不同的列,因为它包含相同的列名(、patio_antes、patio_antes)。

但是,如果给定的bus_tmp.interno没有匹配的bus.interno,那么两个bus.patio_antes and.patio_actual都将被设置为NULL。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63798296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档