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多表连接查询的执行细节
Apr 24 MySQL
mysql对于模糊查询like的一些汇总
May 09 MySQL
MySQL表字段时间设置默认值
May 13 MySQL
MySQL 8.0 驱动与阿里druid版本兼容问题解决
Jul 01 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
MySQL学习之基础命令实操总结
Mar 19 MySQL
SQL语句多表联合查询的方法示例
Apr 18 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
MySQL常用慢查询分析工具详解
Aug 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的日期与时间函数技巧
2008/04/24 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
php 注册时输入信息验证器的实现详解
2013/07/05 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
2014/06/22 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
jquery将一个表单序列化为一个对象的方法
2014/01/03 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
js变量提升深入理解
2016/09/16 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
wxPython定时器wx.Timer简单应用实例
2015/06/03 Python
node.js获取参数的常用方法(总结)
2017/05/29 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
Python反转序列的方法实例分析
2018/03/21 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
Python 导入文件过程图解
2019/10/15 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
python温度转换华氏温度实现代码
2020/12/06 Python
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
高中自我鉴定范文
2013/11/03 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
golang 比较浮点数的大小方式
2021/05/02 Golang
netty 实现tomcat的示例代码
2022/06/05 Servers