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 语法的分析相关推荐

  1. MySQL中 ON DUPLICATE KEY UPDATE语法的使用

    MySQL ON DUPLICATE KEY UPDATE 为Mysql特有语法 ON DUPLICATE KEY UPDATE 用法与说明 Mysql中INSERT ... ON DUPLICATE ...

  2. insert...on duplicate key update语法详解

    一.作用和使用场景 在mysql入库时,不能出现两条数据主键一致的情况,因为在两条数据的主键一致的情况下,mysql就会判定为待插入数据在数据库中存在重复数据,也就是说判断数据是否重复是根据主键来区别 ...

  3. mysql批量insert bug_MySQL Bug insert into on duplicate key update 语法更新 text blob 大字段导致 MySQL crash...

    1. 背景 业务执行 SQL 导致 MySQL 进程 Crash,做故障切换后,新的主库又 Crash 了.查看 MySQL 错误日志,发现多次 Crash 时的堆栈相同,如下: Thread poi ...

  4. Mysql on duplicate key update用法及优缺点

    在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,一般思路是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有ON DUPL ...

  5. mysql多个on_在多个查询中插入多行的MySQL ON DUPLICATE KEY UPDATE

    我有一个SQL查询,我想在单个查询中插入多行.所以我用了类似的东西: $sql = "INSERT INTO beautiful (name, age) VALUES ('Helen', 2 ...

  6. mybatis中mysql ON DUPLICATE KEY UPDATE写法

    2019独角兽企业重金招聘Python工程师标准>>> <insert id="batchInsertFansInfo" parameterType=&qu ...

  7. 【MySQL】ON DUPLICATE KEY UPDATE 解决重复插入问题

    参考文章:mysql "ON DUPLICATE KEY UPDATE" 语法 ON DUPLICATE KEY UPDATE 开发过程中,可能会遇到这样的需求,先判断某一记录是否 ...

  8. (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE

    (转载)http://blog.zol.com.cn/2299/article_2298921.html MySQL 自4.1版以后开始支持INSERT - ON DUPLICATE KEY UPDA ...

  9. MySQL使用on duplicate key update时导致主键不连续自增

    在做数据统计的时候,我们经常会用到mysql的on duplicate key update语法来自动更新数据,比如 最近项目上需要实现这么一个功能:统计每个人每个软件的使用时长,客户端发过来消息,如 ...

最新文章

  1. 软件单元测试工具比较
  2. centos 安装php5.6
  3. 最近流行的12个笑话,好笑又有道理
  4. C# Socket多线程编程实例
  5. TSYS2.0对动态碎片的一点理解
  6. VirtualBox是什么
  7. matlab fread函数详解
  8. cc2640蓝牙数据接收丢包问题
  9. 樊登读书赋能读后感_《赋能》读后感心得体会
  10. qq影音4.0 android,QQ影音4.0官方最新正式版
  11. Java Swing制作古老的打砖块游戏
  12. 将当前列表视图导出到Excel中
  13. 免费游戏模型材质资源包(值得下载)Free Content Pack
  14. 盘点3大智能家居系统|苹果HomeKit、亚马逊Alexa、谷歌Home?
  15. DC-DC15-150V降压5V0.8A 替代PN6005、PN6006电源驱IC
  16. 自定义变量的一个有趣案例
  17. 计算机应用基础中级,《计算机应用基础》中级测试题-针对考题实操
  18. (7)Artemis传输配置
  19. 刚刚,华为决定起诉美国政府
  20. 某些年自己做的毕业设计代码和分析过程记录

热门文章

  1. 机器学习:使用numpy实现数据增强(Data Augmentation)
  2. 第二阶段 铁大Facebook——十天冲刺(六)
  3. bzoj 1684: [Usaco2005 Oct]Close Encounter【数学(?)】
  4. CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用
  5. Aspose Cells 控件如何实现数据过滤(附代码和下载地址)
  6. OpenCV——素描
  7. ZYNQ学习(1) —— 基础开发流程
  8. php判断ip地址小程序
  9. Asp.net(C#)常用函数表--新手必备
  10. 2.3.4 mysql 用户密码管理