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如何构建数据表索引
May 13 MySQL
Navicat连接MySQL错误描述分析
Jun 02 MySQL
mysql 索引合并的使用
Aug 30 MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 MySQL
Mysql数据库手动及定时备份步骤
Nov 07 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
MySQL数据库 安全管理
May 06 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
面试官问我Mysql的存储引擎了解多少
Aug 05 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实现过滤表单提交中html标签的方法
2014/10/17 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
2020/06/05 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
使用python分析git log日志示例
2014/02/27 Python
跟老齐学Python之用Python计算
2014/09/12 Python
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
快速了解Python相对导入
2018/01/12 Python
Python属性和内建属性实例解析
2020/01/14 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
python破解同事的压缩包密码
2020/10/14 Python
CSS3实现多重边框的方法总结
2016/05/31 HTML / CSS
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
支教自我鉴定
2014/01/18 职场文书
团代会宣传工作方案
2014/05/08 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
公证书
2019/04/17 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
python爬虫之selenium库的安装及使用教程
2021/05/23 Python