原文链接:https://blog.csdn.net/qq_42269354/article/details/100589640

首先声明:ON DUPLICATE KEY UPDATE 为MySQL特有语法;

语句的作用:当insert已经存在的记录时,执行update

用法
举个栗子:

table1表中有几条数据如下:

表中的主键为ID,现要插入一条数据,ID为4,name为修改4,password为xiugaimima4,正常写法为:

INSERT INTO table1(`id`,`name`,`password`,`date`)
VALUES('4','修改4','xiugaimima4',now());

执行后刷新表数据,我们来看表中内容:

此时表中数据增加了一条主键为id为’1’,name为’修改4’,password为’xiugaimima4’的记录,当我们再次执行插入语句时,会发生什么呢?

执行:

INSERT INTO table1(`id`,`name`,`password`,`date`)
VALUES('4','修改4','xiugaimima4',now());

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

在原SQL后面增加 ON DUPLICATE KEY UPDATE

INSERT INTO table1(`id`,`name`,`password`,`date`)
VALUES('4','修改4','xiugaimima4',now())
ON DUPLICATE KEY UPDATE
id='5',password='xiugaimima5';

我们再一次执行:

可以看到,受影响的行为2,这是因为将原有的记录修改了,而不是执行插入,看一下表中数据:

原来id为4的记录,改为了5,password也变为了xiugaimima5,很好的解决了重复插入问题。

扩展
当插入多条数据,其中不只有表中已存在的,还有需要新插入的数据,MySQL会如何执行呢?

会不会报错呢?

其实MySQL远比我们想象的强大,会只能的选择更新还是插入,我们尝试一下:

INSERT INTO table1(`id`,`name`,`password`,`date`)
VALUES('4','修改5','xiugaimima5',now()),
('5,'修改4','xiugaimima4',now())
ON DUPLICATE KEY UPDATE
id='5',name='修改4',password='xiugaimima4';

运行SQL语句:

MySQL执行了一次修改,一次插入,表中数据为:

将ID为5的修改了两个字段的值,新增了一条ID为4的记录。

VALUES修改,做到一条SQL语句批量修改多条数据的不同字段
那么问题又来了,有人会说我ON DUPLICATE KEY UPDATE 后面跟的是固定的值,如果我想要分别给不同的记录修改不同的值怎么办呢?

INSERT INTO table1(`id`,`name`,`password`)
VALUES('4','修改4','xiugaimima4'),
('5,'修改5','xiugaimima5')
ON DUPLICATE KEY UPDATE
name=VALUES(name),password=VALUES(password);
ails/100589640

可以将后面的修改条件改为VALUES(password),动态的传入要修改的值;

执行如下:

成功的修改了两条记录,刷新一下表

我们成功的将不同ID的name、password修改成了不同的值。

但是,这是需要注意的是:

选择写入的字段必须包含所有not null的字段,即非空的字段,如果少写了非空字段,则会报错!!

比如,只想修改name字段,但是password字段也必须写上,如果不想修改password字段,可以写入原来的值。

例如:

虽然我们想要实现一个批量修改的操作,但是实则首先执行的是插入语句,当插入语句(INSERT INTO)执行过程中发现已有重复的主键时才会执行更新(UPDATE)语句,所以非空字段(NOT NULL)一定要写全!

总结
ON DUPLICATE KEY UPDATE 能够让我们便捷的完成重复插入的开发需求,能够让我们使用一条SQL语句实现批量修改多条记录的功能,但它是MySQL的特有语法,使用时应多注意主键和插入值是否是我们想要插入或修改的key、value;还应注意想要实现批量修改时非空字段都要写上。
————————————————
版权声明:本文为CSDN博主「学无止境,好好学习,天天向上!」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42269354/article/details/100589640

仓库储存,存在添加减少,不存在插入ON DUPLICATE KEY UPDATE的更多相关文章

  1. ON DUPLICATE KEY UPDATE重复插入时更新

    mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...

  2. ON DUPLICATE KEY UPDATE 当记录不存在时插入,当记录存在时更新

    MySQL 当记录不存在时插入,当记录存在时更新网上基本有三种解决方法.第一种:示例一:插入多条记录假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:INSERTINT ...

  3. mysql ON DUPLICATE KEY UPDATE重复插入时更新

    mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...

  4. mysql 添加数据如果数据存在就更新ON DUPLICATE KEY UPDATE和REPLACE INTO

    #下面建立game表,设置name值为唯一索引. CREATE TABLE `game` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar( ...

  5. mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into

    转: mysql insert时几个操作DELAYED .IGNORE.ON DUPLICATE KEY UPDATE的区别 博客分类: mysql基础应用   mysql insert时几个操作DE ...

  6. 批量插入或更新操作之ON DUPLICATE KEY UPDATE用法

    实际的开发过程中,可能会遇到这样的需求,先判断某一记录是否存在,如果不存在,添加记录,如果存在,则修改数据.在INSERT语句末尾指定ON DUPLICATE KEY UPDATE可以解决这类问题. ...

  7. MySQL: ON DUPLICATE KEY UPDATE 用法 避免重复插入数据

    INSERT INTO osc_visit_stats(stat_date,type,id,view_count) VALUES (?,?,?,?) ON DUPLICATEKEY UPDATE vi ...

  8. MYSQL主键存在则更新,不存在则插入的解决方案(ON DUPLICATE KEY UPDATE)

    经常我们使用的最简单的数据库操作就是数据的更新,删除和插入,对于批量删除和插入的方法相信大家都很清楚,那么批量更新估计有的人就不知道了,并且还有批量插入,在插入时若有主键冲突则更新的操作,这在EAV模 ...

  9. [转]主键冲突的话就更新否则插入 (ON DUPLICATE KEY UPDATE )

    mysql "ON DUPLICATE KEY UPDATE" 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQ ...

随机推荐

  1. 谈谈如何绕过 TinyPNG 对上传图片数量的限制

    前端er, 又称为切图仔,平时经常需要用 PSD 导出 PNG 或 JPG,但是导出来的的图片一般比较大,往往需要用一些其他工具压缩后再发布到生产环境. 以前常用的做法是,使用 image-webpa ...

  2. Quartz.Net系列(九):Trigger之CronScheduleBuilder和Cron表达式详解

    1.使用 var scheduler =await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); var jo ...

  3. JVM源码分析之Java对象头实现

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十一篇. 今天呢!灯塔君跟大家讲: JVM源码分析之Java对象头实现 HotSpot虚拟机中,对象在内存中的布局分为三 ...

  4. Java源码详解系列(十)--全面分析mybatis的使用、源码和代码生成器(总计5篇博客)

    简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...

  5. .NET 开源项目 StreamJsonRpc 介绍[中篇]

    阅读本文大概需要 11 分钟. 上一篇介绍了一些预备知识,包括 JSON-RPC 介绍和实现了 JSON-RPC 的 StreamJsonRpc 介绍,讲到了 StreamJsonRpc 可以通过 . ...

  6. 读CSAPP第二章的收获

    一:一道很有意思的位运算题目:你只有两种操作 bis(x, y): 在y为1的每个位置上,将x的对应的位设为1bic(x, y): 在y为1的每个位置上,将x的对应的位设为0 简单的化简一下bis(x ...

  7. mongodb(一):数据库安装,部署(windows)

    全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/10885038.html,多谢~=.= 安装MongoDB 双击运行msi文件,一直“Next”. ...

  8. python 装饰器(三):装饰器实例(一)

    示例 7-15 定义了一个装饰器,它会在每次调用被装饰的函数时计时,然后把经过的时间.传入的参数和调用的结果打印出来.示例 7-15 一个简单的装饰器,输出函数的运行时间 import time de ...

  9. 数据可视化之分析篇(十)Power BI应用:如何计算在职员工数量?

    ​https://zhuanlan.zhihu.com/p/128652582 经常碰到的一类问题是,如何根据起止日期来计算某个时间点的数量,比如: 已知合同的生效日期和到期日期,特定日期的有效合同有 ...

  10. Oracle基础概述

    本部分主要参考”风哥“的Oracle入门视频. 一.体系结构概述 1.物理结构(文件结构) Oracle有四种文件:控制文件.数据文件.日志文件.参数文件 其中日志文件分为两类:联机日志文件.归档日志 ...