【MySQL】面试官问我:MySQL如何实现无数据插入,有数据更新?我是这样回答的!
写在前面
马上就是金九银十的跳槽黄金期了,很多读者都开始出去面试了。这不,又一名读者出去面试被面试官问了一个MySQL的问题:向MySQL中插入数据,如何实现MySQL中没有当前id标识的数据时插入数据,有当前id标识的数据时更新数据。其实,这题目一点也不难!!
先来个简单题目
正式回答这个面试题时,我们先来看一个简单点的题目:如何实现向MySQL中插入数据时,存在则忽略,不存在就插入?其实,这个简单点的题目与标题的题目有相同的地方:都是MySQL中不存在待插入的数据时,就将待插入的数据插入到MySQL中。不同点是:标题中的题目是存在待插入的数据时执行更新操作,而这个简单点的题目是存在待插入的数据时直接忽略,不执行任何操作。
我们先来回答这个简单点的题目。其实,在面试过程中,我们需要揣测面试官的心理,很显然,这里,面试官是想问如何通过SQL语句来实现,并且这样的题目往往都会有一个前置条件:那就是数据表中必须存在唯一键,也就是唯一索引。如果你回答的是你写了一段Java代码或者C语言代码来实现,那你就基本被pass了。这没得说,因为你回答的方向与面试预期的方向不同!
关于这个简单点的题目,我们可以使用insert ignore语句实现。语法格式如下所示。
insert ignore into table(col1,col2) values ('value1','value2');
比如,我们执行如下SQL语句向MySQL中插入数据。
insert ignore into user_info (last_name,first_name) values ('binghe','binghe');
这样一来,如果表中已经存在last_name='binghe'且first_name='binghe'的数据,就不会插入,如果没有就会插入一条新数据。
上面的是一种用法,也可以用 INSERT .... SELECT 语句来实现,这里就不举例了。
分析标题题目
接下来,我们再来看标题中的题目,向MySQL中插入数据,存在就更新,不存在则插入。本质上数据表中还是需要存在唯一键,也就是唯一索引的。往往在面试中,面试官都会默许存在这些前置条件。
这里,有两种方法可以实现这个效果。一种方法是结合INSERT语句和ON DUPLICATE KEY UPDATE语句实现,另一种方法是通过REPLACE语句实现。
INSERT语句和ON DUPLICATE KEY UPDATE语句实现
如果指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。
REPLACE语句实现
使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE和INSERT时添加事务等复杂操作了。在使用REPLACE时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE就和INSERT完全一样的。在执行REPLACE后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了DELETE删除这条记录,然后再记录用INSERT来插入这条记录。
语法和INSERT非常的相似,如下面的REPLACE语句是插入或更新一条记录。
REPLACE INTO users (id,name,age) VALUES(1, 'binghe', 18);
重磅福利
关注「 冰河技术 」微信公众号,后台回复 “设计模式” 关键字领取《深入浅出Java 23种设计模式》PDF文档。回复“Java8”关键字领取《Java8新特性教程》PDF文档。回复“限流”关键字获取《亿级流量下的分布式限流解决方案》PDF文档,三本PDF均是由冰河原创并整理的超硬核教程,面试必备!!
好了,今天就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!!
写在最后
如果你觉得冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!

【MySQL】面试官问我:MySQL如何实现无数据插入,有数据更新?我是这样回答的!的更多相关文章
- 面试官问我MySQL索引,我
面试官:我看你简历上写了MySQL,对MySQL InnoDB引擎的索引了解吗? 候选者:嗯啊,使用索引可以加快查询速度,其实上就是将无序的数据变成有序(有序就能加快检索速度) 候选者:在InnoDB ...
- 面试官问我MySQL调优,我真的是
面试官:要不你来讲讲你们对MySQL是怎么调优的? 候选者:哇,这命题很大阿...我认为,对于开发者而言,对MySQL的调优重点一般是在「开发规范」.「数据库索引」又或者说解决线上慢查询上. 候选者: ...
- 面试官问你MySQL的优化,看这篇文章就够了
作者:zhangqh segmentfault.com/a/1190000012155267 一.EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划. 下面来个简单的示例 ...
- 面试官:为什么Mysql中Innodb的索引结构采取B+树?
前言 如果面试官问的是,为什么Mysql中Innodb的索引结构采取B+树?这个问题时,给自己留一条后路,不要把B树喷的一文不值.因为网上有些答案是说,B树不适合做文件存储系统的索引结构.如果按照那种 ...
- 互联网公司面试必问的mysql题目(下)
这是mysql系列的下篇,上篇文章地址我附在文末. 什么是数据库索引?索引有哪几种类型?什么是最左前缀原则?索引算法有哪些?有什么区别? 索引是对数据库表中一列或多列的值进行排序的一种结构.一个非常恰 ...
- 面试官问我,Redis分布式锁如何续期?懵了。
前言 上一篇[面试官问我,使用Dubbo有没有遇到一些坑?我笑了.]之后,又有一位粉丝和我说在面试过程中被虐了.鉴于这位粉丝是之前肥朝的粉丝,而且周一又要开启新一轮的面试,为了回馈他长期以来的支持,所 ...
- 每日一问:面试结束时面试官问"你有什么问题需要问我呢",该如何回答?
面试结束时面试官问"你有什么问题需要问我呢",该如何回答?
- 面试官问,说一个你在工作非常有价值的bug
如果你去参考面试,做足了准备,面对面试官员从容不迫,吐沫横飞的大谈自己的工作经历.突然,面试官横插一句:说一个你在工作非常有价值的bug.顿时,整个空气都仿佛都凝固了!“What?”... 我想没几个 ...
- 面试官问:JS的this指向
前言 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实.读者可以先拉到底部看总结,再谷歌(或各技术平台)搜索几篇类似文章,看笔者写的文章和别人有什么不同(欢迎在评论 ...
随机推荐
- Python os.closerange() 方法
概述 os.closerange() 方法用于关闭所有文件描述符 fd,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略.高佣联盟 www.cgewang.com 语法 clo ...
- mit-6.828 Lab01:Booting a PC exercise1.1
Lab01:Booting a PC 目录 Lab01:Booting a PC JOS BIOS 背景知识 8086的基本知识 GDB 常用调试指令 Real mode && Pro ...
- day7.关于字符串的相关操作
一.字符串的相关操作 """ (1)字符串的拼接 (2)字符串的重复 (3)字符串跨行拼接 (4)字符串的索引 (5)字符串的切片: 语法 => 字符串[::] 完 ...
- Ajax中关于xmlhttp.readyState的值及解释
xmlhttp.readyState的值及解释:0:请求未初始化(还没有调用 open()).1:请求已经建立,但是还没有发送(还没有调用 send()).2:请求已发送,正在处理中(通常现在可以从响 ...
- Flask框架(二):路由与蓝图
一.路由 使用 route() 装饰器来把函数绑定到 URL: @app.route('/') def index(): return 'Index Page' @app.route("/h ...
- ftp服务器的安装
vsftp的安装: 1.安装: yum -y install vsftpd 2.添加ftp用户: useradd ftpuser 3.给ftp用户添加密码: passwd ftpuser 输入两次密码 ...
- 数据洞察 | Python解读地摊——你想好摆摊去卖什么了吗?
知乎上有一个问题:疫情结束后,你最想做的一件事是什么? 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去 ...
- Python 3.9 beta2 版本发布了,看看新特性?
随着 Python 3.9.0b1 的发布,即开发周期中计划的四个 beta 版本的首个,Python 3.9 的功能已经是完善了.在 10 月发布最终版本之前,还会有许多测试和稳定性方面的工作要做. ...
- Java三大特性与实战
三大特性: 封装,集成,多态 编程思想 类和对象: 方法的重载 this关键字 static关键字 静态代码块 package import Object 抽象类 接口 lambda表达式 字符串St ...
- 微信小程序开发着工具获取和更新newticket
newticket是微信开发者工具和微信后台交互的凭证.大多数工具的操作都是需要newticket. 如何获取newticket? 打开开发者工具,依次点击菜单设置->通用设置->代理,使 ...