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

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.kler.cn/a/447354.html

相关文章:

  • 前端导出PDF的组件及方法
  • 【Maven】dependencyManagement依赖版本管理
  • harmony UI组件学习(1)
  • Git实用指南(精简版)
  • 【ETCD】【Linearizable Read OR Serializable Read】ETCD 数据读取:强一致性 vs 高性能,选择最适合的读取模式
  • 文心一言对接FreeSWITCH实现大模型呼叫中心
  • linux日常常用命令(AI向)
  • Java(二十六)Object类equals与toString
  • 探索 Python 中的控制语句:break、continue 和 else
  • WPS 认证机制
  • 半连接转内连接规则的原理与代码解析 |OceanBase查询优化
  • Socket 收发内部拆包封包函数
  • python 曲线拟合,曲线拟合交点
  • Linux搭建Alist(本地存储)
  • AS-REP Roasting离线爆破攻击
  • 探索AI安全治理,打造大模型时代的可信AI
  • 雅思真题短语梳理(五)
  • Facebook的隐私保护政策:用户数据如何在平台上被管理?
  • WSL切换默认发行版
  • 启动打印服务提示:Http端口已被使用,请修改
  • 全脐点曲面当且仅当平面或者球面的一部分
  • android recycleview 中倒计时数据错乱
  • puppet 配置 6 变量的特殊用法
  • python--在服务器上面创建conda环境
  • 多线程设计模式-保护性暂停之面向对象
  • django中cookie与session的使用