深⼊mysqlONDUPLICATEKEYUPDATE语法的分析
mysql "ON DUPLICATE KEY UPDATE" 语法
如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插⼊⾏后会导致在⼀个UNIQUE索引或PRIMARY KEY
中出现重复值,则在出现重复值的⾏执⾏UPDATE;如果不会导致唯⼀值列重复的问题,则插⼊新⾏。
例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果:
复制代码 代码如下:
INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE TABLE SET c=c+1 WHERE a=1;
如果⾏作为新记录被插⼊,则受影响⾏的值显⽰1;如果原有的记录被更新,则受影响⾏的值显⽰2。
这个语法还可以这样⽤:
如果INSERT多⾏记录(假设 a 为主键或 a 是⼀个 UNIQUE索引列):
复制代码 代码如下:
INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=c+1;
执⾏后, c 的值会变为 4 (第⼆条与第⼀条重复, c 在原值上+1).
复制代码 代码如下:
INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=VALUES(c);
执⾏后, c 的值会变为 7 (第⼆条与第⼀条重复, c 在直接取重复的值7).
注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法!
这个语法和适合⽤在需要 判断记录是否存在,不存在则插⼊存在则更新的场景.
如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插⼊⾏后会导致在⼀个UNIQUE索引或PRIMARY KEY
中出现重复值,则执⾏旧⾏UPDATE;如果不会导致唯⼀值列重复的问题,则插⼊新⾏。例如,如果列a被定义为UNIQUE,
并且包含值1,则以下两个语句具有相同的效果:
复制代码 代码如下:
INSERT INTO TABLE (a,b,c)
VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE TABLE SET c=c+1 WHERE a=1;

如果作为新记录被插⼊,则受影响⾏的值为1;如果原有的记录被更新,则受影响⾏的值为2。

如果你想了解更多关于INSERT INTO .. ON DUPLICATE KEY的功能说明,详见MySQL参考⽂档:13.2.4. INSERT语法
现在问题来了,如果INSERT多⾏记录, ON DUPLICATE KEY UPDATE后⾯字段的值怎么指定?要知道⼀条INSERT语句中
只能有⼀个ON DUPLICATE KEY UPDATE,到底他会更新⼀⾏记录,还是更新所有需要更新的⾏。这个问题困扰了我很久
了,其实使⽤VALUES()函数⼀切问题都解决了。
举个例⼦,字段a被定义为UNIQUE,并且原数据库表table中已存在记录(2,2,9)和(3,2,1),如果插⼊记录的a值与原有记录重
复,则更新原有记录,否则插⼊新⾏:
复制代码 代码如下:
INSERT INTO TABLE (a,b,c) VALUES
(1,2,3),
(2,5,7),
(3,3,6),
(4,8,2)
ON DUPLICATE KEY UPDATE b=VALUES(b);
以上SQL语句的执⾏,发现(2,5,7)中的a与原有记录(2,2,9)发⽣唯⼀值冲突,则执⾏ON DUPLICATE KEY UPDATE,将原有
记录(2,2,9)更新成(2,5,9),将(3,2,1)更新成(3,3,1),插⼊新记录(1,2,3)和(4,8,2)
注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法!

深⼊mysqlONDUPLICATEKEYUPDATE语法的分析的更多相关文章

  1. C++ 类的多态五(多态的语法本质分析)

    //多态的语法本质分析 #include<iostream> using namespace std; /* 三种易混淆的多态场景 */ class Point{ public: Poin ...

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

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

  3. 深入mysql "on duplicate key update" 语法的分析

    如果在INSERT语句末尾指定了on duplicate key update,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不 ...

  4. 看看C# 6.0中那些语法糖都干了些什么(终结篇)

    终于写到终结篇了,整个人像在梦游一样,说完这一篇我得继续写我的js系列啦. 一:带索引的对象初始化器 还是按照江湖老规矩,先扒开看看到底是个什么玩意. 1 static void Main(strin ...

  5. SQLite3源程序分析之分析器的生成

    1.概述 Lemon是一个LALR(1)文法分析器生成工具,与bison和yacc类似,是一个可以独立于SQLite使用的开源的分析器生成工具.而且它使用与yacc(bison)不同的语法规则,可以减 ...

  6. dom树的介绍,及原理分析

    三.解析和DOM树的构建 1.解析: 由于解析渲染引擎是一个非常重要的过程,我们将会一步步的深入,现在让我们来介绍解析. 解析一个文档,意味着把它转换为一个有意义的结构——代码可以了解和使用的东西,解 ...

  7. 基于EBNF语法的描述

    基于JavaCC的语法描述 使用JavaCC从token序列中识别出"语句" “表达式” “函数调用” 等语法单位的方法. 只要为JavaCC描述“语句” “表达式” “函数调用” ...

  8. 【编译原理】c++实现自下而上语法分析器

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  9. spark-sql执行流程分析

    spark-sql 架构 图1 图1是sparksql的执行架构,主要包括逻辑计划和物理计划几个阶段,下面对流程详细分析. sql执行流程 总体流程 parser:基于antlr框架对 sql解析,生 ...

  10. css中代码格式以及@import的语法结构

    CSS中代码格式 CSS是Cascading Style Sheets(层叠样式表)的缩写.是一种对web文档添加样式的简单机制,属于表现层的布局语言. 1.基本语法规范分析一个典型CSS的语句: p ...

随机推荐

  1. Git Flow开发分支管理

    Git Flow Git Flow 是一种基于 Git 版本控制系统的分支管理模型,定义了一套严格的分支命名和操作规范 主要包括以下几种分支类型: 主干分支(master):始终保持稳定,只包含经过充 ...

  2. 推荐一个Star超过2K的.Net轻量级的CMS开源项目

    推荐一个具有模块化和可扩展的架构的CMS开源项目. 01 项目简介 Piranha CMS是一个轻量级且跨平台的CMS库,专为.NET 8设计. 该项目提供多种模板,具备CMS基本功能,也有空模板方便 ...

  3. Python之subprocess 执行报错

    问题 我用subprocess 执行命令查 主机Ip 报错 ​ command = """ "grep {0} /etc/hosts | awk '{print ...

  4. 国密SSL证书,为政务数据安全保驾护航

    随着数字化转型的加速,政务信息化建设已成为提升政府服务效率和质量的关键.近期,国家相关部门发布了<互联网政务应用安全管理规定>,为政务应用的安全管理提供了明确的规范和要求.该规定自2024 ...

  5. ExtJS & Asp.NET

    企业应用中,要快速开发Web应用,前端使用ExtJS还行,包含许多常用的控件,图标,配色方案... 帖上部分载图: 完全可订制的登录界面: 可调整的布局: 可综合使用的模态对话框: 树结构及动态加载: ...

  6. (Python基础教程之三)Python代码中添加注释

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

  7. SpringMVC-Mybatis-Maven项目整合

    上次不知道为什么,把写好的系列文章都搞成一样了.结果,五篇文章,都变成了最后一篇文章. 悲剧,好吧,只好重新写了. 这系列文章写的是SpringMVC-Mybatis-Maven项目整合.说白了,其实 ...

  8. Java线程:线程的调度-守护线程——Java线程:线程的调度-合并——Java线程:新特征-障碍器——Java线程:大总结

    Java线程:线程的调度-守护线程   守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程.   守护线程使用的情况较少,但并非无用,举例 ...

  9. 在不同形式的for循环中使用break、continue、return的效果

    我们在循环中,经常会有跳出循环,跳出本次循环继续下次循环等的场景,今天我们简单分享下.主要使用到的关键字是,break.continue.return.先将结果总结: ①在foreach中不能使用br ...

  10. OpenEuler文件被锁定的解决方法|网卡修改不生效的解决办法

    欧拉系统(含centos等linux系统)修改文件,一直提示readonly,不让改.原因有可能是这个文件给锁定了. 解决方法: 使用以下两个命令: • chattr 改变文件属性 • lsattr ...