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 05 MySQL
mysql对于模糊查询like的一些汇总
May 09 MySQL
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
安装配置mysql及Navicat prenium的详细流程
Jun 10 MySQL
MySQL 聚合函数排序
Jul 16 MySQL
SQL IDENTITY_INSERT作用案例详解
Aug 23 MySQL
mysql函数全面总结
Nov 11 MySQL
SQL 聚合、分组和排序
Nov 11 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 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分页显示制作详细讲解
2006/10/09 PHP
php 空格,换行,跳格使用说明
2009/12/18 PHP
php比较两个字符串长度的方法
2015/07/13 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
PHP时间类完整代码实例
2021/02/26 PHP
JavaScript delete 属性的使用
2009/10/08 Javascript
JavaScript 三种创建对象的方法
2009/10/16 Javascript
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
vue实现登录功能
2020/12/31 Vue.js
python 编程之twisted详解及简单实例
2017/01/28 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
晨会主持词
2014/03/17 职场文书
感恩寄语大全
2014/04/11 职场文书
运动会新闻稿
2015/07/17 职场文书
小学教代会开幕词
2016/03/04 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python
详细了解MVC+proxy
2021/07/09 Java/Android
Golang 并发下的问题定位及解决方案
2022/03/16 Golang