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 08 MySQL
详解GaussDB for MySQL性能优化
May 18 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
MySQL CHAR和VARCHAR该如何选择
May 31 MySQL
全面盘点MySQL中的那些重要日志文件
Nov 27 MySQL
一文弄懂MySQL索引创建原则
Feb 28 MySQL
mysql 子查询的使用
Apr 28 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 MySQL
MySQL sql模式设置引起的问题
May 15 MySQL
MySQL普通表如何转换成分区表
May 30 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
discuz Passport 通行证 整合笔记
2008/06/30 PHP
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
mysql 性能的检查和优化方法
2009/06/21 PHP
探讨PHP调用时间格式的参数详解
2013/06/06 PHP
php抽奖小程序的实现代码
2013/06/18 PHP
PHP获取服务器端信息的方法
2014/11/28 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
php图片裁剪函数
2018/10/31 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
node.js中watch机制详解
2014/11/17 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
Python字符串函数strip()原理及用法详解
2020/07/23 Python
Perricone MD裴礼康美国官网:抗衰老护肤品
2016/09/26 全球购物
计算机专业大学生的自我评价
2013/11/14 职场文书
记者岗位职责
2014/01/06 职场文书
晚会邀请函范文
2014/01/24 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
大班开学家长寄语
2014/04/04 职场文书
党员活动日总结
2014/05/05 职场文书
增员口号大全
2014/06/18 职场文书
企业优秀团员事迹材料
2014/08/20 职场文书
政风行风整改方案
2014/10/25 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL