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

71 mysql 中 insert into ... on duplicate key update ... 的实现

前言

这个也是我们经常可能会使用到的相关的特殊语句 

当插入数据存在 唯一索引 或者 主键索引 相关约束的时候, 如果存在 约束冲突, 则更新目标记录 

这个处理是类似于 逻辑上的 save 操作 

insert into tz_test_02 (field1, field2) values ('field11', '11') 
on duplicate key update field2 = '22'; 

 

 

该操作 整体逻辑类似于如下

Sting key = entity.key();
Object entityInDb = repository.findByKey(key);
if(entityInDb == null) {repository.insert(entity);return ;
}
repository.updateByKey(entity);

 

 

我们这里主要是从 mysql 源码的层面来看一下 mysql 这边是怎么处理的 

当然 相对比较简单, 大体的流程 和上面 一样, 我们会忽略 大部分的细节

相对来说 比较简单, 不花费太多的信息来描述 

 

测试数据表如下 

CREATE TABLE `tz_test_02` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`field1` varchar(128) DEFAULT NULL,`field2` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `field_1` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

e5c7e3b014147202130ddbc8ef2824b5.png

 

 

服务器这边的数据插入

这里会先进行数据插入, 如果插入失败 走相关的补偿处理

463a31138603d5b06af88d243cf75206.png

 

然后在插入索引记录的时候, 由于 索引的唯一约束, 插入失败, 这里响应 DB_DUPLICATE_KEY 的错误 

b858774e08c4cebf61a5d5567a228d54.png

 

 

服务器这边数据更新

在补偿的处理里面, 根据目标条件对目标记录进行更新 

这里相当于执行的是 是一个 “update tz_test_02 set field2 = '22' where field1 = 'field11';”

10f2e9dc09c65fc71386d0135e943661.png

 

 

 

 

 

http://www.lryc.cn/news/507336.html

相关文章:

  • 计算机网络-GRE Over IPSec实验
  • 你的第一个博客-第一弹
  • 若依启动项目时配置为 HTTPS 协议
  • 学习思考:一日三问(学习篇)之匹配VLAN
  • [WiFi] WiFi 802.1x介绍及EAP认证流程整理
  • 用C#(.NET8)开发一个NTP(SNTP)服务
  • Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
  • ABAP SQL 取日期+时间最新的一条数据
  • 【Rust自学】4.3. 所有权与函数
  • 【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
  • 用docker快速安装电子白板Excalidraw绘制流程图
  • 使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动
  • 人工智能入门是先看西瓜书还是先看花书?
  • winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序,在需要屏蔽双击窗体最大化、最小化、关闭
  • 进程内存转储工具|内存镜像提取-取证工具
  • 数据结构day5:单向循环链表 代码作业
  • (OCPP服务器)SteVe编译搭建全过程
  • Mybatis分页插件的使用问题记录
  • 36. Three.js案例-创建带光照和阴影的球体与平面
  • CentOS 7 安装、测试和部署FastDFS
  • 全志H618 Android12修改doucmentsui选中图片资源详情信息
  • 【083】基于51单片机智能烘手器【Proteus仿真+Keil程序+报告+原理图】
  • uniApp使用腾讯地图提示未添加maps模块
  • 未来趋势系列 篇五:自主可控科技题材解析和股票梳理
  • Springboot 学习 之 logback-spring.xml 日志压缩 .tmp 临时文件问题
  • maven-resources-production:ratel-fast: java.lang.IndexOutOfBoundsException
  • K8s docker-compose的入门
  • 去雾Cycle-GAN损失函数
  • word实现两栏格式公式居中,编号右对齐
  • vtie项目中使用到了TailwindCSS,如何打包成一个单独的CSS文件(优化、压缩)