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创建索引需要了解的
Apr 08 MySQL
MySQL安装后默认自带数据库的作用详解
Apr 27 MySQL
mysql在项目中怎么选事务隔离级别
May 25 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
MySQL 百万级数据的4种查询优化方式
Jun 07 MySQL
浅谈MySQL 亿级数据分页的优化
Jun 15 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
Jul 26 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
利用JuiceFS使MySQL 备份验证性能提升 10 倍
Mar 17 MySQL
MySQL学习之基础命令实操总结
Mar 19 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
sql查询语句之平均分、最高最低分及排序语句
May 30 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
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
2015/02/05 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
Python快速从注释生成文档的方法
2016/12/26 Python
TensorFlow实现Softmax回归模型
2018/03/09 Python
python获取代理IP的实例分享
2018/05/07 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
flask应用部署到服务器的方法
2019/07/12 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
好的演讲稿开场白
2013/12/30 职场文书
运动会通讯稿500字
2014/02/20 职场文书
安全责任书范文
2014/03/12 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
员工保密承诺书
2014/05/28 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
大二学生自我检讨书
2014/10/23 职场文书
2014年平安夜寄语
2014/12/08 职场文书
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript