MySql语句中的ON DUPLICATE KEY UPDATE使用详解

news2024/11/17 9:51:01

目录

  • 一:主键索引,唯一索引和普通索引的关系
    • 1. 主键索引
    • 2. 唯一索引:
    • 3. 普通索引:
      • 1:ON DUPLICATE KEY UPDATE功能介绍:
      • 2:ON DUPLICATE KEY UPDATE测试样例+总结:
  • 执行以下实验进行分析:
    • 实验一:含有ON DUPLICATE KEY UPDATE的INSERT语句中包含主键:
    • 实验二:含有ON DUPLICATE KEY UPDATE的INSERT语句中包含唯一索引:
  • 总结:
  • 再次总结:

一:主键索引,唯一索引和普通索引的关系

1. 主键索引

主键索引是唯一索引的特殊类型。
数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。
在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。主键索引不能为空。每个表只能有一个主键

2. 唯一索引:

不允许两行具有相同的索引值。但可以都为NULL,笔者亲试。
如果现有数据中存在重复的键值,则数据库不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。每个表可以有多个唯一索引
在这里插入图片描述

3. 普通索引:

一般的索引结构,可以在条件删选时加快查询效率,索引字段的值可以重复,可以为空值

二:ON DUPLICATE KEY UPDATE使用测试(MYSQL下的Innodb引擎)
上面介绍了索引的知识,是为了介绍这个ON DUPLICATE KEY UPDATE功能做铺垫。

1:ON DUPLICATE KEY UPDATE功能介绍:

有时候由于业务需求,可能需要先去根据某一字段值查询数据库中是否有记录,有则更新,没有则插入。你可能是下面这样写的

if not exists (select node_name from node_status where node_name = target_name)
      insert into node_status(node_name,ip,...) values('target_name','ip',...)
else
      update node_status set ip = 'ip',site = 'site',... where node_name = target_name

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

  1. 性能带来开销,尤其是系统比较大的时候。
  2. 在高并发的情况下会出现错误,可能需要利用事务保证安全。

有没有一种优雅的写法来实现有则更新,没有则插入的写法呢?ON DUPLICATE KEY UPDATE提供了这样的一个方式。

2:ON DUPLICATE KEY UPDATE测试样例+总结:

首先我们了解下这个简单的表结构id(主键)、code、name。
在这里插入图片描述
看下表中现有的数据:
在这里插入图片描述

执行以下实验进行分析:

实验一:含有ON DUPLICATE KEY UPDATE的INSERT语句中包含主键:

  1. 插入更新都失败,原因是因为把主键id改成了已经存在的id
    在这里插入图片描述
  2. 执行更新操作。这里的数据还是四条。不过第四条的id由75变化为85
    在这里插入图片描述
    在这里插入图片描述
  3. 执行更新操作。数据总量是四条
    在这里插入图片描述
    在这里插入图片描述
  4. insert语句中未包含主键,执行插入操作。数据量变为5条
    在这里插入图片描述
    在这里插入图片描述

实验二:含有ON DUPLICATE KEY UPDATE的INSERT语句中包含唯一索引:

表结构中增加code的唯一索引,表中现有的数据:
在这里插入图片描述
在这里插入图片描述

  1. 插入更新都失败,原因是因为把code改成了已经存在的code值
    在这里插入图片描述
  2. 执行更新操作。这里的数据总量为5条。不过第五条的code由1000变化为1200
    在这里插入图片描述
    在这里插入图片描述
  3. 执行更新操作。数据总量五条,没有变化
    在这里插入图片描述
    在这里插入图片描述
  4. insert语句中未包含唯一索引,执行插入操作。数据量变为6条
    在这里插入图片描述
    在这里插入图片描述

总结:

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

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

再次总结:

以 insert into product_brand (code,name) values (500,“诺基亚”),(1500,“瓜子”) on duplicate key update name =values(name); 为例

1、唯一索引控制的是该数据是插入还是修改,当唯一索引对应的值存在时,就修改,否则新增 ;上述例子中,因为唯一索引是 code ,而code=500存在,code=1500不存在,所以(500,“诺基亚”)是修改,(1500,“瓜子”)是新增

2、on duplicate key update后面部分控制的是当唯一索引所对应的值存在时需要修改哪些内容,name =values(name)表示修改name属性;上述例子中,数据库中code=500,name=“魅族” ,SQL中(500,“诺基亚”),所以数据库最终保存的数据是code=500,name=“诺基亚”
在这里插入图片描述
更多MySQL操作,请见:https://www.runoob.com/mysql/mysql-install.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1418134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果m1、m2安装blender GIS,解决not Imageio 报错

blender-GIS 能够在地图上生成地形,如下图所示: 使用blenderGIS过程中会有 imageio 找不到的情况, 网上的 imageio 用在苹果电脑的M1、M2芯片上好像还是没有出图,似乎这个 imageio 这个已经是好几年前的代码,没能适配…

100天精通鸿蒙从入门到跳槽——第20天:ArkTS装饰器@Link双向数据绑定

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》 — Go语言学习之旅!《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师!100天…

C语言——O / 动态内存管理

一、为什么要有动态内存分配 我们已经掌握的内存开辟⽅式有: int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的⽅式有两个特点: • 空间开辟⼤⼩是固定的。 • 数组在申明的时候&am…

头戴式耳机推荐,适合学生党入手的平价头戴式耳机型号品牌推荐

市面上的头戴式耳机品牌繁多,价格各异,如何选择一款性价比高、适合自己的头戴式耳机呢?作为一个使用过不下十几款的头戴式耳机的大户,接下来我就根据我自己的经验为大家推荐一些平价好用的头戴式耳机,让学生党在预算有…

亚信安慧AntDB:AntDB-M元数据锁(六)

5.4.2 慢路径(slow path) 对于obtrusive锁,以及当前申请unobtrusive锁,而锁对象下已经持有obtrusive锁时,需要进入慢路径申请锁,即先对锁对象下的读写锁加写锁。在当前锁对象首次进入慢路径时,…

iOS 自动打包如何配置配置打包证书和profile provision文件

Jenkins 打包相关问题记录 打包失败截图: 1、证书找不到 NO certificate matching ‘ ‘ for ‘ ’ code singing is required …. D791BAD1-390A-4587-A35C-A743A3D88D52.png 由于更新过证书配置,导致新证书没有导入到Jenkins中。 配置步骤&#xf…

【AI视野·今日Robot 机器人论文速览 第七十六期】Fri, 12 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Fri, 12 Jan 2024 Totally 12 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Topology-Driven Parallel Trajectory Optimization in Dynamic Environments Authors Oscar de Groot, Laura Ferranti, Dari…

Hadoop3.x基础(1)

来源:B站尚硅谷 这里写目录标题 大数据概论大数据概念大数据特点(4V)大数据应用场景 Hadoop概述Hadoop是什么Hadoop发展历史(了解)Hadoop三大发行版本(了解)Hadoop优势(4高)Hadoop组成&#xf…

MMCLMC公差计算.exe

一、概要 软件及完整代码请戳这里:MMC&LMC公差计算软件及代码 图1 软件操作界面 本软件功能主要是根据实际应用选择MMR或者LMR原则,输入基本尺寸、形位公差尺寸和实际测量尺寸,即可计算出对应的公差值。以孔的MMR为例见如图2、3&#xf…

SpringCloud-高级篇(十六)

前面学习了Lua的语法,就可以在nginx去做编程,去实现nginx类里面的业务,查询Redis,查询tomcat等 ,业务逻辑的编写依赖于其他组件,这些组件会用到OpenResty的工具去实现 (1)安装OpenRe…

不熟悉现货白银的震荡行情?你可以试着这样理解

在现货白银交易中,投资者很不想碰到震荡行情,因为震荡行情说明市场没有明确的趋势,而是倾向于横向波动,因此没有潜在风险较低且潜在盈利较大的顺势交易机会。可不幸的是,在市场中大部分时间市场还是会倾向横向震荡&…

WhatsApp首次营销模板怎么写?WhatsApp营销效果怎么样?

近年来,随着社交媒体的飞速发展,WhatsApp作为一种全球通用的即时通讯应用程序,在营销领域备受重视。很多企业开始利用WhatsApp这一平台与客户进行沟通和营销推广活动。本文将探讨WhatsApp首次营销模板如何编写以及其所带来的效果。 首先&…

MG7050VAN 基于声表的差分多输出 晶体振荡器(LVDS)

MG7050VAN的LVDS输出是一款差分多输出晶体振荡器,具有极低的抖动和超强的稳定性。该振荡器适用于多种应用场景,如服务器、存储器和网络仪器等。作为一款高端的LVDS输出设备,该振荡器在输出性能上具有明显优势。其超低抖动水平可以达到0.3ps M…

【机器学习】强化学习(七)-策略梯度算法-REINFORCE 训练月球着陆器代理(智能体)...

概 述 月球着陆器代理是一个模拟飞行器在月球表面着陆的环境,它有八个连续的状态变量,分别是水平坐标、垂直坐标、水平速度、垂直速度、角度、角速度、腿1触地、腿2触地。它有四个离散的动作,分别是什么都不做、发动左方向引擎、发动主引擎、…

情人节爆品出现!单周GMV暴涨6成,直冲20K美金,节庆用品赛道迎来“爆单潮”!

2024新年钟声已经敲响,一大波节日爆品正在疯狂涌现,而这只是一个开始。 开年首月电商流量一波接一波来袭,下一个“消费大节”已经在来的路上!——情人节。 节日营销热点抢量,宜早不宜晚。商家们纷纷开始上新节庆相关…

【详解】贪吃蛇游戏----下篇(完整源码)

目录 引入: 本片文章目的: 整个游戏的实现流程图如下: 游戏实现 GameRun PrintHelpInfo Pause NextIsFood printSnake EatFood NoFood KillByWall KillBySelf GameRun GameEnd 总代码: (1&#xff09…

【Linux】Linux权限的概念 -- 详解

一、Linux 中的用户 Linux 下有两种用户: 超级用户(root):可以在 Linux 系统下做任何事情,不受限制。普通用户:在 Linux 下做有限的事情。 超级用户的命令提示符是 “#”,普通用户的命令提示符…

【算法专题】动态规划综合篇

动态规划7.0 1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 通配符匹配5. 正则表达式匹配6. 交错字符串7. 两个字符串的最小ASCII删除和8. 最长重复子数组 1. 最长公共子序列 题目链接 -> Leetcode -1143.最长公共子序列 Leetcode -1143.最长公共子序列 题目&#xf…

操作系统论述题+第5、6、7、8、9章的知识小点总结(尤其是选择题)

文章目录 一、操作系统论述题怎么提高内存利用率?怎么提高CPU利用率?怎么提高操作系统并发度?这个答案也不知道是什么问题里面的 二、操作系统5、6、7、8、9章选择题知识点第五章:存储器管理第六章:虚拟存储器第七章&a…

【笔试常见编程题03】统计回文、连续最大和、不要二、把字符串转换成整数

1. 统计回文 “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串…