深⼊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 ...
随机推荐
- cmu15545笔记-查询执行(Query Excution)
目录 执行模型 Iterator Model Materialization Model Vectoriazation Model 对比 数据访问方式 Sequential Scan Index Sc ...
- CommonsCollections3(基于ysoserial)
环境准备 JDK1.7(7u80).commons-collections(3.x 4.x均可这里使用3.2版本).javassist(3.12.1.GA) JDK:https://repo.huaw ...
- hyperf使用session
在hyperf里面使用session的时候可以先安装组件包 composer require hyperf/session Session 组件的配置储存于 config/autoload/sess ...
- java公式解析器学习与开发(1)
public class Evaluate { public static void main(String[] args) { Stack<String> ops = new Stack ...
- Linux系统之Ubuntu
常用命令: #查看安装包 dpkg -l 1)切换镜像源 本身的镜像都是国外的,下载依赖包太慢, 需要替换成国内镜像地址 国内镜像源推荐阿里 OPSX 源: https://opsx.alibaba. ...
- rsync之实战
简介 rsync是远程(或本地)复制和同步文件最常用的命令. 借助rsync命令,你可以跨目录,跨磁盘和跨网络远程与本地数据进行复制和同步.举例来说:在两台Linux主机之间进行数据备份和镜像.本文介 ...
- uni-app 简单上手
1.前言 uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.Web(响应式).以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/ ...
- uniapp使用EventBus实现页面间数据传递
前情 最近在做小程序项目,选用是当前比较火的uniapp技术栈,经常会遇到页面间消息传递的需求. 为什么要这么做? uniapp页面间数据通信方式有很多:通过url传参,状态管理库vuex/pinia ...
- CVE-2023-32233 Linux 内核 UAF 漏洞分析与利用
Linux 内核 nftable 模块在处理匿名 set 时存在 UAF. 漏洞分析 漏洞成因是 nf_tables_deactivate_set 在释放匿名 set 时没有将 set 的标记设 ...
- uni-app微信小程序GPS位置获取爬坑
前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验也挺棒的,现在所在公司项目有抖音.快手.微信.支付.APP端, ...