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 22 MySQL
mysql对于模糊查询like的一些汇总
May 09 MySQL
详解MySQL中的主键与事务
May 27 MySQL
MySQL 开窗函数
Feb 15 MySQL
mysql 获取时间方式
Mar 20 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
MySQL导致索引失效的几种情况
Jun 25 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 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 mail to 配置详解
2014/01/16 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
2018/12/21 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
jquery.validate使用攻略 第三部
2010/07/01 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
Python中利用原始套接字进行网络编程的示例
2015/05/04 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
pytorch 把MNIST数据集转换成图片和txt的方法
2018/05/20 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
Python3 log10()函数简单用法
2019/02/19 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
python递归法解决棋盘分割问题
2019/07/17 Python
python实现图片上添加图片
2019/11/26 Python
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
保送生自荐信范文
2013/10/06 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
银行贷款承诺书
2014/03/29 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
如何书写授权委托书?
2019/06/25 职场文书