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_mode的使用详解
May 08 MySQL
一文读懂navicat for mysql基础知识
May 31 MySQL
SQL注入的实现以及防范示例详解
Jun 02 MySQL
ORM模型框架操作mysql数据库的方法
Jul 25 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
MySQL学习之基础操作总结
Mar 19 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 MySQL
Mysql数据库group by原理详解
Jul 07 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 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
php4的session功能评述(二)
2006/10/09 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
原生javascript实现无间缝滚动示例
2014/01/28 Javascript
script标签属性用type还是language
2015/01/21 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
Python help()函数用法详解
2014/03/11 Python
Python实现以时间换空间的缓存替换算法
2016/02/19 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
python 生成图形验证码的方法示例
2018/11/11 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
2019/01/30 Python
python 三元运算符使用解析
2019/09/16 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
numpy实现RNN原理实现
2021/03/02 Python
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
计算机维护专业推荐信
2014/02/27 职场文书
大学应届毕业生求职信
2014/05/24 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
毕业大学生自荐信
2014/06/17 职场文书
安全教育日主题班会
2015/08/13 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js
PostgreSQL事务回卷实战案例详析
2022/03/25 PostgreSQL
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android