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 07 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
MySQL常见优化方案汇总
Jan 18 MySQL
一文弄懂MySQL索引创建原则
Feb 28 MySQL
MYSQL优化之数据表碎片整理详解
Apr 03 MySQL
MySQL 条件查询的常用操作
Apr 28 MySQL
mysql中关键词exists的用法实例详解
Jun 10 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 MySQL
MySQL示例讲解数据库约束以及表的设计
Jun 16 MySQL
mysql sock 文件解析及作用讲解
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
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
使用PHP会话(Session)实现用户登陆功能
2013/06/29 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
采用memcache在web集群中实现session的同步会话
2014/07/05 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
Javascript this指针
2009/07/30 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
基于axios 解决跨域cookie丢失的问题
2018/09/26 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
Python编程中time模块的一些关键用法解析
2016/01/19 Python
Python守护线程用法实例
2017/06/23 Python
python3中zip()函数使用详解
2018/06/29 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
python文件编写好后如何实践
2020/07/07 Python
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
应用数学专业求职信
2014/03/14 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
个人委托书怎么写
2014/09/17 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
Java实现多文件上传功能
2021/06/30 Java/Android
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android