Postgres 9.5 新功能upsert

时间:2021-01-24 12:07:32

     今日批量更新数据库中数据,发现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),脚本执行后,库表中已存在的数据没有做更新操作,新数据执行了插入,再次执行脚本 ,原老数据依然没有做更新操作,第一次执行插入的数据做了更新。完全搞不明白原因。表文以记,也希望知道的童鞋留言相告。