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 10 MySQL
浅谈mysql执行过程以及顺序
May 12 MySQL
MySQL 自定义变量的概念及特点
May 13 MySQL
超详细教你怎么升级Mysql的版本
May 19 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
MySQL 百万级数据的4种查询优化方式
Jun 07 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
SQL语法CONSTRAINT约束操作详情
Jan 18 MySQL
MySQL创建管理HASH分区
Apr 13 MySQL
MySQL三种方式实现递归查询
Apr 18 MySQL
Mysql索引失效 数据库表中有索引还是查询很慢
May 15 MySQL
MYSQL如何查看操作日志详解
May 30 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实现与ASP Banner组件相似的类
2006/10/09 PHP
Linux下ZendOptimizer的安装与配置方法
2007/04/12 PHP
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
PHP删除HTMl标签的实现代码
2013/06/30 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
详解JavaScript函数绑定
2013/08/18 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
jQuery仿写百度百科的目录树
2017/01/03 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
2017/03/14 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
Python数据可视化教程之Matplotlib实现各种图表实例
2019/01/13 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
python 两个数据库postgresql对比
2019/10/21 Python
python机器学习库xgboost的使用
2020/01/20 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
美国老牌主机服务商:iPage
2016/07/22 全球购物
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
药店收银员岗位职责
2015/04/07 职场文书
初一英语教学反思
2016/02/15 职场文书