深入mysql ON DUPLICATE KEY UPDATE 语法的分析
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 INTO .. ON DUPLICATE KEY更新多行记录
如果在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标准语法!
深入mysql ON DUPLICATE KEY UPDATE 语法的分析相关推荐
- MySQL中 ON DUPLICATE KEY UPDATE语法的使用
MySQL ON DUPLICATE KEY UPDATE 为Mysql特有语法 ON DUPLICATE KEY UPDATE 用法与说明 Mysql中INSERT ... ON DUPLICATE ...
- insert...on duplicate key update语法详解
一.作用和使用场景 在mysql入库时,不能出现两条数据主键一致的情况,因为在两条数据的主键一致的情况下,mysql就会判定为待插入数据在数据库中存在重复数据,也就是说判断数据是否重复是根据主键来区别 ...
- mysql批量insert bug_MySQL Bug insert into on duplicate key update 语法更新 text blob 大字段导致 MySQL crash...
1. 背景 业务执行 SQL 导致 MySQL 进程 Crash,做故障切换后,新的主库又 Crash 了.查看 MySQL 错误日志,发现多次 Crash 时的堆栈相同,如下: Thread poi ...
- Mysql on duplicate key update用法及优缺点
在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,一般思路是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有ON DUPL ...
- mysql多个on_在多个查询中插入多行的MySQL ON DUPLICATE KEY UPDATE
我有一个SQL查询,我想在单个查询中插入多行.所以我用了类似的东西: $sql = "INSERT INTO beautiful (name, age) VALUES ('Helen', 2 ...
- mybatis中mysql ON DUPLICATE KEY UPDATE写法
2019独角兽企业重金招聘Python工程师标准>>> <insert id="batchInsertFansInfo" parameterType=&qu ...
- 【MySQL】ON DUPLICATE KEY UPDATE 解决重复插入问题
参考文章:mysql "ON DUPLICATE KEY UPDATE" 语法 ON DUPLICATE KEY UPDATE 开发过程中,可能会遇到这样的需求,先判断某一记录是否 ...
- (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE
(转载)http://blog.zol.com.cn/2299/article_2298921.html MySQL 自4.1版以后开始支持INSERT - ON DUPLICATE KEY UPDA ...
- MySQL使用on duplicate key update时导致主键不连续自增
在做数据统计的时候,我们经常会用到mysql的on duplicate key update语法来自动更新数据,比如 最近项目上需要实现这么一个功能:统计每个人每个软件的使用时长,客户端发过来消息,如 ...
最新文章
- 软件单元测试工具比较
- centos 安装php5.6
- 最近流行的12个笑话,好笑又有道理
- C# Socket多线程编程实例
- TSYS2.0对动态碎片的一点理解
- VirtualBox是什么
- matlab fread函数详解
- cc2640蓝牙数据接收丢包问题
- 樊登读书赋能读后感_《赋能》读后感心得体会
- qq影音4.0 android,QQ影音4.0官方最新正式版
- Java Swing制作古老的打砖块游戏
- 将当前列表视图导出到Excel中
- 免费游戏模型材质资源包(值得下载)Free Content Pack
- 盘点3大智能家居系统|苹果HomeKit、亚马逊Alexa、谷歌Home?
- DC-DC15-150V降压5V0.8A 替代PN6005、PN6006电源驱IC
- 自定义变量的一个有趣案例
- 计算机应用基础中级,《计算机应用基础》中级测试题-针对考题实操
- (7)Artemis传输配置
- 刚刚,华为决定起诉美国政府
- 某些年自己做的毕业设计代码和分析过程记录
热门文章
- 机器学习:使用numpy实现数据增强(Data Augmentation)
- 第二阶段 铁大Facebook——十天冲刺(六)
- bzoj 1684: [Usaco2005 Oct]Close Encounter【数学(?)】
- CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用
- Aspose Cells 控件如何实现数据过滤(附代码和下载地址)
- OpenCV——素描
- ZYNQ学习(1) —— 基础开发流程
- php判断ip地址小程序
- Asp.net(C#)常用函数表--新手必备
- 2.3.4 mysql 用户密码管理