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中你可能忽略的COLLATION实例详解
May 12 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
MySQL之PXC集群搭建的方法步骤
May 25 MySQL
MySQL 不等于的三种使用及区别
Jun 03 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
mysql 子查询的使用
Apr 28 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
MySQL如何修改字段类型和字段长度
Jun 10 MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 MySQL
MySQL数据库配置信息查看与修改方法详解
Jun 25 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
一个简单的php实现的MySQL数据浏览器
2007/03/11 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
jquery 简单导航实现代码
2009/09/11 Javascript
初识javascript 文档碎片
2010/07/13 Javascript
Js sort排序使用方法
2011/10/17 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
vue头部导航动态点击处理方法
2018/11/02 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
Python中的XML库4Suite Server的介绍
2015/04/14 Python
python中hashlib模块用法示例
2017/10/30 Python
python多进程实现文件下载传输功能
2018/07/28 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
英国著名药妆店:Superdrug
2021/02/13 全球购物
聚美优品恶搞广告词
2014/03/14 职场文书
教师自我剖析材料(四风问题)
2014/09/30 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
代码复现python目标检测yolo3详解预测
2022/05/06 Python
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS