深⼊mysqlONDUPLICATEKEYUPDATE语法的分析
深⼊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语法的分析的更多相关文章
- C++ 类的多态五(多态的语法本质分析)
//多态的语法本质分析 #include<iostream> using namespace std; /* 三种易混淆的多态场景 */ class Point{ public: Poin ...
- 深入mysql “ON DUPLICATE KEY UPDATE” 语法的分析
本篇文章是对mysql “ON DUPLICATE KEY UPDATE”语法进行了详细的分析介绍,需要的朋友参考下. mysql “ON DUPLICATE KEY UPDATE” 语法 如果在IN ...
- 深入mysql "on duplicate key update" 语法的分析
如果在INSERT语句末尾指定了on duplicate key update,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE:如果不 ...
- 看看C# 6.0中那些语法糖都干了些什么(终结篇)
终于写到终结篇了,整个人像在梦游一样,说完这一篇我得继续写我的js系列啦. 一:带索引的对象初始化器 还是按照江湖老规矩,先扒开看看到底是个什么玩意. 1 static void Main(strin ...
- SQLite3源程序分析之分析器的生成
1.概述 Lemon是一个LALR(1)文法分析器生成工具,与bison和yacc类似,是一个可以独立于SQLite使用的开源的分析器生成工具.而且它使用与yacc(bison)不同的语法规则,可以减 ...
- dom树的介绍,及原理分析
三.解析和DOM树的构建 1.解析: 由于解析渲染引擎是一个非常重要的过程,我们将会一步步的深入,现在让我们来介绍解析. 解析一个文档,意味着把它转换为一个有意义的结构——代码可以了解和使用的东西,解 ...
- 基于EBNF语法的描述
基于JavaCC的语法描述 使用JavaCC从token序列中识别出"语句" “表达式” “函数调用” 等语法单位的方法. 只要为JavaCC描述“语句” “表达式” “函数调用” ...
- 【编译原理】c++实现自下而上语法分析器
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- spark-sql执行流程分析
spark-sql 架构 图1 图1是sparksql的执行架构,主要包括逻辑计划和物理计划几个阶段,下面对流程详细分析. sql执行流程 总体流程 parser:基于antlr框架对 sql解析,生 ...
- css中代码格式以及@import的语法结构
CSS中代码格式 CSS是Cascading Style Sheets(层叠样式表)的缩写.是一种对web文档添加样式的简单机制,属于表现层的布局语言. 1.基本语法规范分析一个典型CSS的语句: p ...
随机推荐
- Cursor使用
Cursor是一款AI 代码编辑器,官网地址为https://www.cursor.com/,直接在官网下载安装即可,基于VS Code二次开发而来,之所以没有采用插件方式,在官方网站上给出的答案是某 ...
- element 动态合并表格---进阶版
错误展示 正确展示 如果使用上次博客写的element 动态合并表格那么会出现上述图片情况,所以对其进行完善实现下图(正确展示)情况 处理函数 mergeTableRow(data, merge) { ...
- vue2-vuex
专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应 用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信 应用场景: 多个组 ...
- Tensorflow 使用TPU训练
要用TPU训练tensorflow模型,只能使用静态图.也就是要先通过keras的sequential或者函数式定义模型,而不能直接使用重写的Model类.例子如下,其中包含层的自定义,以及子像素卷积 ...
- laravel之任务调度(定时任务)
crontab指令线性增长.毕竟crontab是一项系统级的配置,在业务中我们为了节约机器,往往对于量不大的多个项目会放在同一台服务器上,crontab指令多了就容易管理混乱,并且功能也不够灵活强大( ...
- highcharts中的折线图
折现图表的样式如下所示: 整体的一个设置代码如下: that.options = { title: { text: null }, subtitle: { text: null }, yAxis: { ...
- JDBC【4】-- SPI底层原理解析
前面已经讲过SPI的基本实现原理了,demo也基本实现了,再来说说SPI. http://aphysia.cn/archives/jdbcspi 背景:SPI是什么? SPI,即是Service Pr ...
- 前端每日一知之css选择器
脑图在线链接 本文内容依据[js每日一题]公众号精彩文章总结而来
- R数据分析:反事实框架和因果中介的理论理解
其实很早之前给大家写中介分析的做法的时候我也有思考过当中介变量或者因变量不是连续变量的时候,中介怎么做?或者说这个时候中介的结果如何解释?当时反正是一直没有太想明白这些问题,毕竟这些情况在发表的文献中 ...
- 部署docker-registry+ui shell 域名证书-用户认证
#部署docker-registry+ui shell docker registry 配置域名证书, 用户密码认证, 轻量UI ansible部署docker-registry+ui https:/ ...