当前位置: 首页 > news >正文

MySQL的 insert into ... on duplicate key update语句

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

摘自 http://www.jb51.net/article/39255.htm , 有更改.

当遇到需要执行 更新&插入 业务时,可考虑使用 insert into ... 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。 

这个语法还可以用在多行记录上(假设 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,这里values()函数进行了直接赋值). 

注意ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法! 
这个语法和适合用在需要 判断记录是否存在,不存在则插入存在则更新的场景.

INSERT INTO .. ON DUPLICATE KEY更新多行记录

如果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)

转载于:https://my.oschina.net/u/3412738/blog/1542899

相关文章:

  • 设计图片绘制的展现
  • Vue全家桶实现一个Web App
  • 1.基础知识
  • 请教oschina缓存设计和效率问题(某些表查询后即需要更新某字段的情况如何缓存)...
  • IBM开源JVM实现OpenJ9,并提交Eclipse基金会托管
  • Exchange2007 Web/Outlook邮箱界面语言设定
  • SAP发布wbservice,如果有权限管控的话,需要给这个webservice加权限
  • GDB 常用命令 ***
  • CSDN博客备份2
  • mysql面试题分组并合并列
  • 男人不成熟35个标志
  • 虚机cbt
  • 多线程博文地址 http://www.cnblogs.com/nokiaguy/archive/2008/07/13/1241817.html
  • DotNET企业架构应用实践-系统架构与性能-理论依据及相关技术
  • python里的拆包、引用、递归与匿名函数
  • [LeetCode] Wiggle Sort
  • [NodeJS] 关于Buffer
  • Brief introduction of how to 'Call, Apply and Bind'
  • Create React App 使用
  • Hexo+码云+git快速搭建免费的静态Blog
  • Javascript Math对象和Date对象常用方法详解
  • JS题目及答案整理
  • nodejs:开发并发布一个nodejs包
  • Promise面试题,控制异步流程
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • socket.io+express实现聊天室的思考(三)
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • use Google search engine
  • ViewService——一种保证客户端与服务端同步的方法
  • 聊聊flink的BlobWriter
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 实习面试笔记
  • 异常机制详解
  • 原生Ajax
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • !!Dom4j 学习笔记
  • #android不同版本废弃api,新api。
  • (2.2w字)前端单元测试之Jest详解篇
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (二)windows配置JDK环境
  • (二十四)Flask之flask-session组件
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)ABI是什么
  • .NET delegate 委托 、 Event 事件
  • .NET gRPC 和RESTful简单对比
  • .NET 动态调用WebService + WSE + UsernameToken
  • .Net 路由处理厉害了