Mysql如何实现不存在则插入,存在则更新


Posted in MySQL onMarch 25, 2022

数据准备

Mysql如何实现不存在则插入,存在则更新

ON DUPLICATE KEY UPDATE

insert into test_table(id,username)
VALUES(4,'fukaiit')
ON DUPLICATE KEY UPDATE username='fukaiit'

执行如上sql,该id不存在(此处id不存在,指的是id为X的记录不存在,包括主键、unique索引列等情况),相当于执行了insert部分,普通插入,受影响的行:1。

insert into test_table(id,username)
VALUES(1,'fukaiit')
ON DUPLICATE KEY UPDATE username='fukaiit'

执行如上sql,该id已存在,相当于执行了update部分,受影响的行:2。

执行结果如下,注意只是更新username,是保留了email的。

Mysql如何实现不存在则插入,存在则更新

REPLACE INTO … VALUES…

REPLACE INTO test_table(id,username)
VALUES(5,'fukaiit');

执行如上sql,该id不存在,相当于执行了insert,普通插入,受影响的行:1。

REPLACE INTO test_table(id,username)
VALUES(1,'fukaiit');

执行如上sql,该id已存在,相当于执行了删除再插入的操作,受影响的行:2。

执行结果如下,注意删除后再插入是没有email值的,所以此时email为null,注意与ON DUPLICATE KEY UPDATE的区别。

Mysql如何实现不存在则插入,存在则更新

无论是insert on duplicate key update还是replace into,在插入时MySQL返回的影响行数就是插入的记录数,但是在更新时返回的影响行数是更新行数*2。

INSERT IGNORE INTO … VALUES…

INSERT IGNORE INTO test_table(id,username) 
values(6,'fukaiit');

执行如上sql,该id不存在,相当于执行了insert,普通插入,受影响的行:1。

INSERT IGNORE INTO test_table(id,username) 
values(1,'fukaiit_new');

执行如上sql,该id已存在,忽略了该插入操作,数据没有变化,受影响的行:0。

使用DUAL虚表和NOT EXISTS

该方法与INSERT IGNORE INTO ... VALUES...方法的效果相同。

INSERT INTO test_table(id,username)
SELECT 7,'fukaiit' from DUAL 
where NOT EXISTS (select * from test_table where id=7);

执行如上sql,该id不存在,select子句返回结果集为空,NOT EXISTS成立,相当于执行了insert,普通插入,受影响的行:1。

INSERT INTO test_table(id,username)
SELECT 2,'fukaiit' from DUAL 
where NOT EXISTS (select * from test_table where id=2);

执行如上sql,该id已存在,select子句返回结果集不为空,NOT EXISTS不成立,则未执行插入操作,数据没有变化,受影响的行:0。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

MySQL 相关文章推荐
MySQL优化之如何写出高质量sql语句
May 17 MySQL
超详细教你怎么升级Mysql的版本
May 19 MySQL
Navicat连接MySQL错误描述分析
Jun 02 MySQL
MySQL 如何设计统计数据表
Jun 15 MySQL
MySQL 外键约束和表关系相关总结
Jun 20 MySQL
MySql 8.0及对应驱动包匹配的注意点说明
Jun 23 MySQL
MySQL 1130异常,无法远程登录解决方案详解
Aug 23 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
Mar 22 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
一文解答什么是MySQL的回表
Aug 05 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
Sep 23 MySQL
MySQL插入数据与查询数据
mysql insert 存在即不插入语法说明
Mar 25 #MySQL
MySQL创建表操作命令分享
mysql数据插入覆盖和时间戳的问题及解决
MySQL实战记录之如何快速定位慢SQL
Mar 23 #MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
Mar 23 #MySQL
简单聊一聊SQL注入及防止SQL注入
Mar 23 #MySQL
You might like
Windows下PHP的任意文件执行漏洞
2006/10/09 PHP
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
PHP 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
2009/01/30 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
PHP中将网页导出为Word文档的代码
2012/05/25 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
Linux下PHP加速器APC的安装与配置笔记
2014/10/24 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
使用vue.js写一个tab选项卡效果
2017/03/25 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
Python中optparser库用法实例详解
2018/01/26 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
2020/09/21 Python
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
乡镇干部先进事迹材料
2014/02/03 职场文书
写求职信有哪些注意事项
2014/05/08 职场文书
刑事代理授权委托书
2014/09/17 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
体育教师个人总结
2015/02/09 职场文书