赞
踩
postgresql提供的方法:
ON CONFLICT DO UPDATE保证一个原子的 INSERT或者 UPDATE结果。在没有无关错误的
前提下,这两种 结果之一可以得到保证,即使在很高的并发度也能保证。这也可以被称作
UPSERT — “UPDATE 或 INSERT”。
但是这个方法和oracle中merge into 的方法差异较大,只能单条数据更新或新增,且需要建主键,一般情况下入库的表不建主键,故用do$$代码块实现更新或新增的需要
do $$ declare rec record; record_id integer; begin for rec in (select b.S_CITY_ID b.WEEK_NO, b.sad from IMP_SEND_INFO_W b where b.week_no = to_char(current_date - 7, 'yyyyiw')) loop select count(1) into record_id from IMP_SEND_INFO_WEEK where coalesce(S_CITY_ID,'-1')=coalesce(rec.S_CITY_ID,'-1') and week_no = rec.week_no; if record_id = 0 then insert into imp_send_info_week (S_CITY_ID, WEEK_NO, sad, int_id) values (rec.S_CITY_ID, rec.WEEK_NO, nextval('public.seq_imp_net_optimization')); else update imp_send_info_week set sad=rec.sad where S_CITY_ID=rec.S_CITY_ID and week_no = rec.week_no end if; end loop; end $$;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。