SQL执行一次完成新增或者修改操作-2022新项目
一、业务场景
当前项目中数据库使用的postgresql,pgsql有很多的优点,比如开源免费,适合二次开发。pgsql有很多搭配使用的开源软件,比较易于拓展,语法和标准的SQL语法基本上差异不大。因此很多大公司都再用,比如像平安集团还有之前也听一个朋友说起过华为也是使用pgsql。大公司在进行技术选型时,肯定有出于自身各方面的考虑,是否侵权,数据库的性能,易用性等等的考量,最终才会决定使用。
自己在进行某个操作时的业务场景是这样的,需要先根据条件查询某条数据是否存在,如果不存在则进行新增操作;如果已经存在则进行更新操作。按照这种方式最少都需要操作两次数据库,一次查询,一次新增/更新操作。
二、需求分析
系统请求数量不大的情况下,这种处理方式没什么问题,可是当请求数量逐渐增多的时候,这种处理方式就会开始出现性能下降。那有什么优化方案呢?如果能减少和数据库交互的次数,则就可以达到优化的效果。负责人给我提出一个优化建议,使用新语法来进行操作。
三、解决方案
自己立马去网上查找相关的资料,果然找到有种方式可以用来处理这种情况,语法是这样的:
insert into ke_topic_rank values ('test1','test2','test3', 7) on conflict (cluster,topic,tkey) do update set tvalue=excluded.tvalue;
关键字 on conflict 后面跟一个括号,用来判断括号里面的条件是否存在,如果已经存在则进行更新操作;如果不存在则进行新增操作。这样就大大地简化了与数据库的交互次数,不用在去查询数据之后在做判断。自己立马进行测试,类似的语法如下
INSERT INTO 表 (
gift_id,
gift_type
)
VALUES (
'36963',
3
)
on conflict (主键或者是多个字段,多个字段需要创建唯一组合索引)
do UPDATE
gift_type = 2
在公司测试的时候完全可行。
在搜索答案的同时,自己还发现mysql也具有同样的语法,以前没有注意过。不过Mysql的语法稍微有些区别:
INSERT INTO app_gift_info (
gift_id,
gift_type
)
VALUES (
'36963',
3
)
ON DUPLICATE KEY UPDATE
gift_type = 2;
执行第一次时的结果:
执行第二次时的结果:
测试结果符合要求.
参考文章
https://www.cnblogs.com/huangjinyong/p/9135498.html
https://www.cnblogs.com/swordfall/p/13083714.html
https://www.csdn.net/tags/MtjaEgxsOTAyNDYtYmxvZwO0O0OO0O0O.html