注意:ON DUPLICATE KEY UPDATE 是Mysql特有的语法,仅Mysql有效。

作用:当执行insert操作时,有已经存在的记录,执行update操作。

用法:

有一个test表,id为主键。第一次插入数据

INSERT INTO test(id,name,age)VALUES(1,'2',3),(11,'22',33)

此时表中数据增加了一条主键’id’为‘1’和‘11’的两条记录,当我们再次执行一条id为1的插入语句时,会发生什么呢?

INSERT INTO test(id,name,age)VALUES(1,'张三',13)
INSERT INTO test(id,name,age)VALUES(1,'张三',13)
> 1062 - Duplicate entry '1' for key 'PRIMARY'
> 时间: 0.034s

Mysql告诉我们,我们的主键冲突了,看到这里我们是不是可以改变一下思路,当插入已存在主键的记录时,将插入操作变为修改:

-- 在原sql后面增加 ON DUPLICATE KEY UPDATE
INSERT INTO test ( id, NAME, age )
VALUES( 1, '张三', 13 ) ON DUPLICATE KEY UPDATE id = 1,NAME = '张三',age = 13

执行结果中受影响的行数是2。

-- 在原sql后面增加 ON DUPLICATE KEY UPDATE
INSERT INTO test ( id, NAME, age )
VALUES( 1, '张三', 13 ) ON DUPLICATE KEY UPDATE id = 1,NAME = '张三',age = 13
> Affected rows: 2
> 时间: 0.18s

执行上面的语句结果

此时我们如果再次插入( 1, '张三', 13 ) 的数据时会有什么结果

-- 在原sql后面增加 ON DUPLICATE KEY UPDATE
INSERT INTO test ( id, NAME, age )
VALUES( 1, '张三', 13 ) ON DUPLICATE KEY UPDATE id = 1,NAME = '张三',age = 13
> Affected rows: 0
> 时间: 0.013s

可以看到影响的行数为0。插入的时候主键冲突,ON DUPLICATE KEY UPDATE会执行更新操作,更新为id = 1,NAME = '张三',age = 13 ,但是并没有我们想象的执行更新。

总结:ON DUPLICATE KEY UPDATE首先会检查插入的数据主键是否冲突,如果冲突则执行更新操作,如果ON DUPLICATE KEY UPDATE的子句中要更新的值与原来的值都一样,则不更新。如果有一个值与原值不一样,则更新:

-- 在原sql后面增加 ON DUPLICATE KEY UPDATE
INSERT INTO test ( id, NAME, age )
VALUES( 1, '张三', 13 ) ON DUPLICATE KEY UPDATE id = 1,NAME = '张三',age = 133
> Affected rows: 2
> 时间: 0.014s

执行完毕,id为1的age值改为133

目前id为1的数据age字段值为13,我们执行插入语句时只改变了其中一个值age=133,则影响行数为2。此时注意VALUES( 1, '张三', 13 )  中age值为13,ON DUPLICATE KEY UPDATE子句中age值为133。

如果插入的数据主键有冲突,则修改字段值以ON DUPLICATE KEY UPDATE子句的值为准。

ON DUPLICATE KEY UPDATE子句写的是固定值,怎么动态赋值呢?如果一次插入多条数据,怎么动态获取主键冲突所要更新的值呢?

ON DUPLICATE KEY UPDATE age = VALUES(age)

总结:

1. ON DUPLICATE KEY UPDATE检查主键或唯一索引字段是否冲突。

2. update的字段值与现存的字段值相同,则不更新。

3. 动态更新字段值用VALUES(字段名称)。

ON DUPLICATE KEY UPDATE 用法相关推荐

  1. on duplicate key update用法及优缺点

    Mysql on duplicate key update用法及优缺点 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,一般思路是将其实现分 ...

  2. ON DUPLICATE KEY UPDATE 用法与说明

    ON DUPLICATE KEY UPDATE作用 先声明一点,ON DUPLICATE KEY UPDATE为Mysql特有语法,这是个坑 语句的作用,当insert的时候如果对应的记录已经存在,则 ...

  3. mysql insert into on_MySQL之INSERT INTO ON DUPLICATE KEY UPDATE用法详解 | 夕辞

    MySQL数据库使用中如果主键或唯一键冲突,会报错,因此我们会用到insert into on duplicate key update语法,但是该语法具体怎么用以及返回什么值,今天就来讨论下. 首先 ...

  4. INSERT INTO… ON DUPLICATE KEY UPDATE用法

    使用INSERT的时候 有表T(id,A,B,C,D) 插入的时候希望通过A,B索引唯一记录 ,有重复的时候更新C,D INSERT INTO T(A,B,C,D) VALUES (a,b,c,d) ...

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

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

  6. ON DUPLICATE KEY UPDATE 作用及一句SQL实现批量修改

    ON DUPLICATE KEY UPDATE 作用及一句SQL实现批量修改 本文学习自ON DUPLICATE KEY UPDATE 用法与说明 首先声明:ON DUPLICATE KEY UPDA ...

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

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

  8. on duplicate key update 的用法及优缺点

    项目中数据的操作有时候会令人头大,遇到一个需求: 需要将数据从A数据库的a数据表同步到B数据库的b数据表中(ab表结构相同,但不是主从关系...just同步过去) 第一次同步过去,b表为空,同步很简单 ...

  9. SQL语句中ON DUPLICATE KEY UPDATE column=IF(条件,值1,值2 ) 的使用

    Insert...on duplicate key相信大家都知道了,是一个非常好用的功能,可以在批量导入数据的时候插入并且保证在key冲突的时候执行更新操作而不是报错.笔者最近写代码的时候却碰到一个需 ...

最新文章

  1. EasyUI表单验证,自定义插件验证,自定义js插件验证,远程验证,常见手机号,中英文,qq等验证规则验证...
  2. 《你不知道的Javascript--上卷 学习总结》(原型)
  3. jquery中对小数进行取整
  4. Mac OS X 10.8.5 安装编译glib
  5. 自然语言处理笔记-哈工大 关毅
  6. Bootstrap3 排版-地址
  7. videojs 动态加载视频
  8. [原]解决百度地图多个Marker和InfoWindow时总是打开最后一个InfoWindow的问题
  9. XML转换为dataframe
  10. kettle和spoon ETL数据同步工具
  11. QtDesigner配置
  12. ANSYS Electronics Desktop 19.2电机仿真思路
  13. convert 8bit/10bit RGB444,YUV444,NV12,NV21 to PNG
  14. 学习的 定义是什么?生物
  15. PHP实现用户登录注册(详细教程)
  16. 机器人底盘的核心技术及应用案例
  17. [Android Input系统]MotionEvent的序列化传送
  18. 离线数仓建设及技术选型
  19. pmos低电平驱动_MOS管驱动电路总结
  20. 2021年全球无线天线收入大约6724.2百万美元,预计2028年达到14740百万美元

热门文章

  1. Python深度学习(循环神经网络)--学习笔记(十三)
  2. [转]信息安全相关理论题(三)
  3. 什么是渲染? 通俗易懂的理解
  4. 信息系统项目管理师(2022年) —— 第 13 章 项目合同管理
  5. Jsp+mysql在线考试系统论文
  6. Combo Box 组合框控件总结
  7. 2.2 拓扑空间与连续映射
  8. java:mybatis:工具类example详解
  9. padding有两种设置方式:
  10. 什么是僵死进程(Zombies)