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系列之十四 MySQL的高可用实现
Jul 02 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
浅谈MySQL函数
Oct 05 MySQL
MyBatis 动态SQL全面详解
Oct 05 MySQL
解析MySQL索引的作用
Mar 03 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
MySQL数据库事务的四大特性
Apr 20 MySQL
mysql幻读详解实例以及解决办法
Jun 16 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
Sep 23 MySQL
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
May 08 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
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
PHP 裁剪图片成固定大小代码方法
2009/09/09 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
在Python中使用dict和set方法的教程
2015/04/27 Python
Python 递归函数详解及实例
2016/12/27 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
单位实习证明怎么写
2014/01/17 职场文书
升国旗仪式主持词
2014/03/19 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
2014年小学教研工作总结
2014/12/06 职场文书
2015年大学生工作总结
2015/04/21 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书
升学宴学生致辞
2015/09/29 职场文书
小学三年级班主任工作经验交流材料
2015/11/02 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
Python制作一个随机抽奖小工具的实现
2021/07/07 Python
python多次执行绘制条形图
2022/04/20 Python