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
服务器这边的数据插入
这里会先进行数据插入, 如果插入失败 走相关的补偿处理
然后在插入索引记录的时候, 由于 索引的唯一约束, 插入失败, 这里响应 DB_DUPLICATE_KEY 的错误
服务器这边数据更新
在补偿的处理里面, 根据目标条件对目标记录进行更新
这里相当于执行的是 是一个 “update tz_test_02 set field2 = '22' where field1 = 'field11';”
完