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 24 MySQL
MySQL Threads_running飙升与慢查询的相关问题解决
May 08 MySQL
MySQL主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
MYSQL主从数据库同步备份配置的方法
May 26 MySQL
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
MySQL外键约束(FOREIGN KEY)案例讲解
Aug 23 MySQL
MYSQL 的10大经典优化案例场景实战
Sep 14 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 MySQL
MySQL事务的ACID特性以及并发问题方案
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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
2011/06/30 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
PHP高并发和大流量解决方案整理
2021/03/09 PHP
childNodes.length与children.length的区别
2009/05/14 Javascript
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
Python类的专用方法实例分析
2015/01/09 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
简单实现Python爬取网络图片
2018/04/01 Python
python 修改本地网络配置的方法
2019/08/14 Python
flask 实现token机制的示例代码
2019/11/07 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
Hotels.com南非:酒店预订
2017/11/02 全球购物
给实习单位的感谢信
2014/02/01 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
辞职信范文大全
2015/03/02 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python