今日批量更新数据库中数据,发现postgres 9.5版本起,新增了一个功能,upsert
1.新增数据时,若数据已经存在与表中,则更新对应记录
2.若记录不在表中,则直接插入数据。
而这个功能恰恰是我需要使用的。
语法:
[ ON CONFLICT [ conflict_target ] conflict_action
示例:insert into t2 values(1,'XX') ON CONFLICT(id) do update set name=EXCLUDED.name ;
注意事项:
1.使用该功能时,表中必须有主键或唯一索引,以免并发情况下,会产生重复数据。
2.conflict_target 为约束字段,比如id 为主键。也可写入组合唯一索引
3.类似功能:mysql ---> insert into on duplicate key;
oracle ----> merge into
问题:在脚本执行过程中,在本地测试环境库中(9.5.10),数据执行没有问题。
公司测试环境上qa环境,数据库(9.5.7),脚本执行后,库表中已存在的数据没有做更新操作,新数据执行了插入,再次执行脚本 ,原老数据依然没有做更新操作,第一次执行插入的数据做了更新。完全搞不明白原因。表文以记,也希望知道的童鞋留言相告。