当前位置: 首页 > news >正文

一条SQL如何实现insertOrUpdate

题目

一条sql如何实现插入或更新
具体描述:有一张表,表中有两个字段id和name,现在往数据库中要插入一条数据,这条数据如果id不存在则插入,如果id存在则更新

分析

日常开发中,都是通过ORM框架实现,比如MybatisPlus提供的saveOrUpdate,或者使用Mybatis先查询判断id是否存在,然后分别执行insert或update。

MybatisPlus的saveOrUpdate存在问题
MybatisPlus的saveOrUpdate是一个非原子性操作,saveOrUpdate()内部先进行查询,再进行插入/更新,这两个操作都不是原子操作,在高并发场景下,无法保证操作的原子性。
如何解决

  1. 使用乐观锁
    在数据库表中添加版本号字段(如version),通过@Version注解实现乐观锁。更新时自动校验版本号,避免并发覆盖。
    @Version
    private Integer version;
    
  2. 加分布式锁
    在分布式系统中,可以对关键操作加上分布式锁(如Redission锁),确保在同一时间内只有一个节点能够执行saveOrUpdate()操作。
  3. 基于数据库层面实现
    也就说今天要说的一条sql实现插入或更新

方法

不同数据库的实现方法存在差别,这里只写三个库为例

Mysql

INSERT INTO  test(id, name) VALUES (1, 'zhangsan') ON DUPLICATE KEY UPDATE name='zhangsan';
# 或
REPLACE INTO test(id, name) value (1, 'zhangsan');

推荐 ON DUPLICATE KEY UPDATE实现
原因

  • replace into:id存在会删除原记录,然后新增一条记录,如果主键id是自增会导致主键改变
  • on duplicate key update:id存在会更新原记录,主键不变

Postgresql

INSERT INTO test(id, name) VALUES (1, 'zhangsan') ON CONFLICT (id) DO UPDATE SET name = 'zhangsan';

Sqlite

INSERT OR REPLACE INTO test(id, name) VALUES (1, 'zhangsan');
http://www.dtcms.com/a/550254.html

相关文章:

  • 结构优化过程可视化的两种方法
  • 做网站建站点seo的描述正确
  • 百度站长seo搭建网站需要学什么
  • 旅游网站 系统江阴百度推广公司
  • Spring Al学习9:模型上下文协议(MCP)
  • 浙江省大成建设集团有限公司网站wordpress 插件有后门
  • linux 网站开发网络营销员岗位的职责与要求
  • 网站首页置顶是怎么做电商系统服务好的商家
  • 做网站没有数据家庭网做网站
  • 陕西高速公路建设网站有专门做辩论的网站吗
  • 怎么登陆建设工程网站php网站开发要学什么软件
  • Visual Basic 数据打印
  • 算法学习 18
  • 【19】C语言多向分支Switch case语法详解
  • 上海网站建设高端创业平台app有哪些
  • 从近10年历年论文题目看系统分析师考试出题趋势
  • IDS车载入侵检测系统
  • 人工智能重塑金融数字化:从精准服务到生态革新的全景探索
  • 合肥seo网站优化上海排名优化推广工具
  • WebRTC项目架构详解
  • 个人网站一定要备案吗手机医疗网站建设
  • 公司网站建设计入什么费用网站建设中图片是什么
  • 西安企业自助建站系统私人定制音乐app软件
  • 哪个网站能帮助做试卷贵州软件制作
  • 滨州市城乡建设部网站首页把excel做数据库分享成网站
  • Tailwind CSS 使用指南
  • Ubuntu18.04部署k8s
  • wordpress 格子主题长沙专业网站优化定制
  • 11. 深入Spring AI:格式化输出
  • seo网站推广可以自己搞吗电子商务平台建设实施方案