一.场景

当你想存入一条数据到扩展表中(主表下附表),但这个扩展表并非一定会创建,就会让其工程逻辑复杂化

(也就是说:有可能创建主表数据的同时不会创建扩展表数据,这样就会照成你想修改的时候,扩展表本身是没有数据的,导致你可能要先创建数据,但这样就需要在调用一次创建方法,并且要做逻辑上的判断)

而本次介绍的SQL功能就是:解决如果数据库中该表没有数据就创建,有数据就修改的需求

优点:

方便、优雅

缺点:

高并发的场景下,容易锁死,所以还是不太建议使用的

msyql的innodb5.0以上版本有很多的陷阱,即有可能导致death lock死锁也有可能导致主从模式下的replication产生数据不一致

产生death lock原理

insert ... on duplicate key 在执行时,innodb引擎会先判断插入的行是否产生重复key错误,如果存在,在对该现有的行加上S(共享锁)锁,如果返回该行数据给mysql,然后mysql执行完duplicate后的update操作,然后对该记录加上X(排他锁),最后进行update写入。

可参考文章:https://www.2cto.com/database/201711/695662.html

MySQL文章:https://bugs.mysql.com/bug.php?id=52020

注意:

①一个唯一键,或者主键(insert into列中包含该键)

②不能跟where条件

③表中有多个唯一键时可能造成死锁,使用时注意

强调一点:

on duplicate key update后面跟全部更新的字段=值,也就是说insert into填写values()中的值,全部以key=value的形式填写在update后面,否则会出现不更新,或者更新某些字段的情况!!!

二.格式

INSERT INTO 表名(添加的字段1, 添加的字段2) VALUES ("字段1的值", 字段2的值) ON DUPLICATE KEY UPDATE 修改的字段= VALUES(修改的字段)

三.案例

根据SKU调整下载视频次数

  • product_sku   SKU
  • download_video_number  下载视频次数
# 这样如果product_extend表中没有数据就直接执行INSERT INTO 创建,有值就执行UPDATE修改download_video_number字段
INSERT INTO product_extend (product_sku, download_video_number)
VALUES ("wzw", 2)
ON DUPLICATE KEY UPDATE download_video_number = VALUES(download_video_number)

四.扩展

直接SQL执行

在查资料的时候发现了另一种新的写法可用于参考:这里的区别是直接用SQL查询直接替代传值,只需要传入条件product_sku就可以了

INSERT INTO order_burst_sku (order_id, sku, quantity, create_time)
(
SELECT t2.order_id order_id, t2.product_sku sku, SUM(t2.sale_quantity) quantity, NOW()
FROM order t1
LEFT JOIN order_item t2 ON t1.platform_order_id = t2.order_id
WHERE 1 = 1t2.product_sku = 'wzw'
GROUP BY t2.order_id, t2.product_sku
) ON DUPLICATE KEY UPDATE quantity = VALUES(quantity)

亦可以参考以下格式

MySQL之"数据库中没有就创建,有就修改"ON DUPLICATE KEY UPDATE的更多相关文章

  1. MySql之on duplicate key update详解

    在我们的日常开发中,你是否遇到过这种情景:查看某条记录是否存在,不存在的话创建一条新记录,存在的话更新某些字段.你的处理方式是不是就是按照下面这样? $result = mysql_query('se ...

  2. 深入mysql “ON DUPLICATE KEY UPDATE” 语法的分析

    本篇文章是对mysql “ON DUPLICATE KEY UPDATE”语法进行了详细的分析介绍,需要的朋友参考下. mysql “ON DUPLICATE KEY UPDATE” 语法 如果在IN ...

  3. mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into

    转: mysql insert时几个操作DELAYED .IGNORE.ON DUPLICATE KEY UPDATE的区别 博客分类: mysql基础应用   mysql insert时几个操作DE ...

  4. 涂抹mysql笔记-数据库中的权限体系

    涂抹mysql笔记-数据库中的权限体系<>能不能连接,主机名是否匹配.登陆使用的用户名和密码是否正确.mysql验证用户需要检查3项值:用户名.密码和主机来源(user.password. ...

  5. 自定义tt文本模板实现MySql指数据库中生成实体类

    自定义tt文本模板实现MySql指数据库中生成实体类 1.在项目中依次点击“添加”/“新建项”,选择“文本模板”,输入名称后点击添加. 2.在Base.tt中添加如下代码. <#@ templa ...

  6. C#:CodeSmith根据数据库中的表创建C#数据模型Model + 因为没有钱买正版,所以附加自己写的小代码

    对于C#面向对象的思想,我们习惯于将数据库中的表创建对应的数据模型: 但假如数据表很多时,我们手动增加模型类会显得很浪费时间: 这个时候有些人会用微软提供的EntityFrameWork,这个框架很强 ...

  7. Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践

    转: Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践 阿里加多 0.1 2018.03.23 17:19* 字数 492 阅读 2613评论 2喜欢 1 一.前 ...

  8. MySQL中ON DUPLICATE KEY UPDATE使用

    今天做推断插入用到了MySQL中ON DUPLICATE KEY UPDATE,如今Mark下面! 假设你想做到数据库中没有数据的话插入数据.有数据的话更新数据,那么你能够选择ON DUPLICATE ...

  9. Mysql中Insert into xxx on duplicate key update问题

    要点:Insert into xxx on duplicate key update可以在唯一索引重复的情况下,进行更新操作.           (1) 插入里边的字段应该只有一个 唯一索引:   ...

  10. mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

    replace into和insert into on duplicate key update都是为了解决我们平时的一个问题 就是如果数据库中存在了该条记录,就更新记录中的数据,没有,则添加记录. ...

随机推荐

  1. DispatcherPriority 枚举

    DispatcherPriority 枚举 ApplicationIdle 2 枚举值为 2. 在应用程序空闲时处理操作. Background 4 枚举值为 4. 在完成所有其他非空闲操作后处理操作 ...

  2. [CF696B] Puzzles 题解

    首先很好想到要用树形 \(dp\). 然后设 \(dp_i\) 为遍历到第 \(i\) 个点的期望时间,\(sz_i\) 代表 \(i\) 的子树大小. 发现有转移方程: \[dp_i=dp_{fa_ ...

  3. OpenLayers 4326地图 根据距离设置地图分辨率

    问题:给一个距离,如何确定4326地图缩放等级或者分辨率使地图视口范围为这个距离 我本来打算计算从地图视口左上角到右下角的距离来计算地图缩放的,然后发现不好算,我也不会算,于是就计算水平方向距离的缩放 ...

  4. 图片的 rgb信息 byte[] 直接转换为bmp文件

    方法1: /// <summary> /// rgb像素值转换为bmp文件 /// </summary> /// <param name="buffer&quo ...

  5. centos 运行springboot 项目

    jar文件发布: 准备工作: 发布在springboot项目中的pom.xml文件添加如下: <build> <plugins> <plugin> <grou ...

  6. Ubuntu 22.04 添加 AppImage 到应用程序

    前言 AppImage 逐渐成为 Linux 常用的一种软件包格式,本文将介绍如何将 AppImage 文件添加到 Ubuntu 的应用程序中. 如下图中的 CAJViewer : 操作过程 设置相关 ...

  7. FastAPI 自定义参数验证器完全指南:从基础到高级实战

    title: FastAPI 自定义参数验证器完全指南:从基础到高级实战 date: 2025/3/11 updated: 2025/3/11 author: cmdragon excerpt: 本教 ...

  8. 微信小程序云函数

    小程序开发云环境设置 注意事项 每一个云函数都是一个独立的 nodeJS 项目.所以每个云函数下都有 package.json 文件 错误 前端操作数据库 1 指引 2 新建集合 3 新增记录 4 查 ...

  9. 【技术分析】EIP-7702 场景下 EOA 授权签名的安全探讨

    EIP-7702 在 2025 年即将到来的以太坊 Pectra 升级中,将会引入 EIP-7702 这个提案.其主要的内容就是使得 EOA 账户拥有了自己的 Storage ,并且可以通过 dele ...

  10. goframe API 自定义接口返回值处理

    前言 goframe 默认使用了中间键 ghttp.MiddlewareHandlerResponse, HTTP Server 的数据返回通过 ghttp.Response 对象实现,ghttp.R ...