IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 收藏夹吃灰系列(十一):插入更新sql语句 ON DUPLICATE KEY UPDATE 使用详解 | 超级详细,建议收藏! -> 正文阅读

[大数据]收藏夹吃灰系列(十一):插入更新sql语句 ON DUPLICATE KEY UPDATE 使用详解 | 超级详细,建议收藏!

一:使用背景

? ? ? ? 在项目中,你可能遇到这么一种场景,由于业务需求,需要先根据某一字段值查询数据库中是否有记录,有则更新,没有则插入。

????????对于这种需求,我想先看看大家是怎么玩的,在想听到大家怎么实现该需求之前,我先给介绍一下,我前同事的实现逻辑,后续就是该代码被弃用,进而被优化。

????????基本就是如下进行逻辑并合先进行查询再进行新增或更新操作。

if not exists (select task_name from task where task_name = target_name)
      insert into task(task_name ,point_ids,substation_id) values('target_name','point_ids','substation_id')
else
      update task set task_name = 'target_name',point_ids= 'point_ids',substation_id= 'substation_id' where task_name = target_name

虽然这样写在大多数情况下可以满足我们的需求,但是会有两个问题。

①性能带来开销,尤其是系统比较大的时候。

②在高并发的情况下会出现错误,可能需要利用事务保证安全。

... ...

那么是否有更优雅的玩法?

肯定是有的,今天bug菌就给大家介绍一种超牛的写法,。

ON DUPLICATE KEY UPDATE

没错,就是它啦。

肯定很多小伙伴都见过,那具体怎么玩呢,请听我一一道来。

?二、ON DUPLICATE KEY UPDATE 介绍

在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,

而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新;

如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新纪录插入操作。

...?...

说通俗点就是数据库中存在某个记录时,执行这个语句会更新,而不存在这条记录时,就会插入。

三、ON DUPLICATE KEY UPDATE 用法

Insert into tablename(field1,field2,field3,......) values(value1,value2,value3,....) 
on duplicate key update field1=value1,field2=value2,field3=value3,......;

注意点:
因为这是个插入语句,所以不能加where条件。

四、实例演示

TaskMapper.java

void insertOrUpdate(@Param("tasks") List<Task> tasks, @Param("substationId") Integer substationId);

TaskMapper.xml

<insert id="insertOrUpdate">
    insert into task(task_name,point_ids,substation_id)VALUES
    <foreach item="item" collection="tasks" open="(" separator="," close=")">
        #{item.taskName}, #{item.pointIds},#{substationId}
    </foreach>
    ON DUPLICATE KEY UPDATE
    point_ids = VALUES(point_ids),substation_id = VALUES(substation_id);
</insert>

提问1:

平时执行单sql Affected rows 结果要么是1,要么是0,咋这条sql执行ssqlAffected rows是2呢?

?... ...大大的疑惑,有木有

带大家看看官方文档的说明就明白了

原文:

With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row, 2 if an existing row is updated, and 0 if an existing row is set to its current values

翻译过来也就是说:

如果是插入操作,受到影响行的值为1;如果更新操作,受到影响行的值为2;如果更新的数据和已有的数据一样(就相当于没变,所有值保持不变),受到影响的行的值为0。

... ...

这下大家可明白了?

提问2:

????????发现使用该子句自增id会跳长,本来自增id 到10,下一次自增id应该为11,但是下一次新增成功记录后,却发现自增id为12了?为啥呢,而且增长跨度和SQL的执行次数还成正比。

答:其实这很好理解,ON DUPLICATE KEY UPDATE 的一次执行,代表更新操作也会使自增ID加1的。

当然,自增ID在许多业务中只是作为一个记录唯一性标识而已,跳跃增长影响并不大。?

五、总结

1:ON DUPLICATE KEY UPDATE 需要有在INSERT语句中有存在主键或者唯一索引的列,并且对应的数据已经在表中才会执行更新操作。而且如果要更新的字段是主键或者唯一索引,不能和表中已有的数据重复,否则插入更新都失败。

2:不管是更新还是增加语句都不允许将主键或者唯一索引的对应字段的数据变成表中已经存在的数据。?


?往期热文推荐:


?OK,今天的文章先写到这。如果问题还请及时批评指正。

?如果文章对您有所帮助,就请在文章末尾的左下角把大拇指点亮吧!(#^.^#);

?如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(?′?‵?)づ╭?~;

?对文章有任何问题欢迎小伙伴们下方留言或者入群探讨【群号:708072830】;

?鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);

?版权声明:本文为博主原创文章,转载请附上原文出处链接和本文声明,版权所有,盗版必究!(*^▽^*).

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-26 10:14:50  更:2021-09-26 10:15:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:32:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码