zoukankan      html  css  js  c++  java
  • 【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均是由冰河原创并整理的超硬核教程,面试必备!!

    好了,今天就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!!

    写在最后

    如果你觉得冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!

  • 相关阅读:
    pandas Dataframe filter
    process xlsx with pandas
    data manipulate in excel with easyExcel class
    modify registry in user environment
    add number line in vim
    java import webservice
    ctypes MessageBoxA
    music 163 lyrics
    【python实例】自动贩卖机
    【python基础】sys模块(库)方法汇总
  • 原文地址:https://www.cnblogs.com/binghe001/p/13569050.html
Copyright © 2011-2022 走看看