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 22 MySQL
Mysql基础之常见函数
Apr 22 MySQL
MySQL Router实现MySQL的读写分离的方法
May 27 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
Jun 26 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
Jul 02 MySQL
MySQL系列之六 用户与授权
Jul 02 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
Jul 25 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 MySQL
mysql中int(3)和int(10)的数值范围是否相同
Oct 16 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
MYSQL如何查看操作日志详解
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
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
Jquery 组合form元素为json格式,asp.net反序列化
2009/07/09 Javascript
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
你必须知道的Javascript知识点之"深入理解作用域链"的介绍
2013/04/23 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
Python脚本实现下载合并SAE日志
2015/02/10 Python
基于python时间处理方法(详解)
2017/08/14 Python
基于python 字符编码的理解
2017/09/02 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
python实现kmp算法的实例代码
2019/04/03 Python
python制作图片缩略图
2019/04/30 Python
对Django url的几种使用方式详解
2019/08/06 Python
巴西香水和化妆品购物网站:The Beauty Box
2019/09/03 全球购物
大学毕业的自我鉴定
2013/10/08 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
股权转让协议范本
2014/12/07 职场文书