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 18 MySQL
MySQL注入基础练习
May 30 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
解析MySQL binlog
Jun 11 MySQL
MySQL 使用索引扫描进行排序
Jun 20 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
MySQL表类型 存储引擎 的选择
Nov 11 MySQL
解析MySQL索引的作用
Mar 03 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
用PHP动态生成虚拟现实VRML网页
2006/10/09 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
JS打印gridview实现原理及代码
2013/02/05 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
vue-axios使用详解
2017/05/10 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
用matplotlib画等高线图详解
2017/12/14 Python
Python内建模块struct实例详解
2018/02/02 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
python实现学生通讯录管理系统
2021/02/25 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
教育孩子心得体会
2014/01/01 职场文书
毕业生自我鉴定实例
2014/01/21 职场文书
修理厂厂长岗位职责
2014/01/30 职场文书
阿德的梦教学反思
2014/02/06 职场文书
美容院营销方案
2014/03/05 职场文书
综治工作汇报材料
2014/10/27 职场文书
英文商务邀请函范文
2015/01/31 职场文书
利用Apache Common将java对象池化的问题
2022/06/16 Servers