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;

执行第一次时的结果:

 SQL执行一次完成新增或者修改操作-2022新项目

执行第二次时的结果:

 SQL执行一次完成新增或者修改操作-2022新项目

测试结果符合要求.

参考文章

https://www.cnblogs.com/huangjinyong/p/9135498.html

 

https://www.cnblogs.com/swordfall/p/13083714.html

 

https://www.csdn.net/tags/MtjaEgxsOTAyNDYtYmxvZwO0O0OO0O0O.html

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/database/279253.html

(0)
上一篇 2022年8月6日 23:53
下一篇 2022年8月6日 23:53

相关推荐

发表回复

登录后才能评论