当前位置: 首页 > 科技观察

MySQL是如何实现无数据插入和数据更新的?我是这样回答的!

时间:2023-03-14 16:33:35 科技观察

作者个人研发在高并发场景下提供了一个简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。开源半年多以来,已成功为十几家中小企业提供精准定时调度解决方案,经受住了生产环境的考验。为了造福更多的童鞋,这里放上开源框架的地址:https://github.com/sunshinelyz/mykit-delay前面写到会是金牌跳槽的黄金期,九而银十,也有不少读者开始外出采访。这不,另一位读者出去面试,被面试官问了个MySQL的问题:往MySQL中插入数据,如何在MySQL中没有当前id标识的数据时插入数据,有数据标识时更新数据通过当前ID。其实这道题一点都不难!!让我们从一个简单的问题开始。在正式回答这个面试题的时候,我们先来看一个比较简单的问题:如何向MySQL中插入数据,存在则忽略,不存在则插入?其实这个简单的题目和题目有相同的地方:当要插入的数据在MySQL中不存在时,将要插入的数据插入到MySQL中。不同的是:题目中的topic是有数据插入时执行update操作,而这个简单的topic是有数据插入时直接忽略,不执行任何操作。让我们先回答这个简单的问题。其实在面试的过程中,我们需要揣测面试官的心理。很显然,在这里,面试官想问的是如何通过SQL语句来实现,而这样的问题往往有一个前置条件:就是数据表必须有唯一键,也就是唯一索引。如果你回答是自己写了一段Java代码或者C语言代码实现的,那基本就pass了。没什么好说的,因为你回答的方向和预期的面试方向不一样!对于这个简单的题目,我们可以使用insertignore语句来实现。语法格式如下。insertignoreintotable(col1,col2)值('value1','value2');例如,我们执行如下SQL语句向MySQL中插入数据。insertignoreintouser_info(last_name,first_name)values('冰河','冰河');这样,如果表中已经存在last_name='binghe'和first_name='binghe'的数据,则不插入,不存在则插入新的数据。以上是一个用法,也可以用INSERT....SELECT语句来实现,这里就不举例了。分析题目接下来我们再看题目中的题目,向MySQL中插入数据,存在则更新,不存在则插入。本质上,数据表中还是需要有一个唯一键,即唯一索引。往往在面试中,面试官会默许这些前提条件的存在。在这里,有两种方法可以达到这种效果。一种方法是结合INSERT语句和ONDUPLICATEKEYUPDATE语句,另一种方法是通过REPLACE语句来实现。INSERT语句和ONDUPLICATEKEYUPDATE语句实现如果指定了ONDUPLICATEKEYUPDATE,插入行会导致UNIQUE索引或PRIMARYKEY中出现重复值,执行UPDATE。例如,如果列a被定义为UNIQUE并且包含值1,则以下两个语句具有相同的效果:INSERTINTOtable(a,b,c)VALUES(1,2,3)ONDUPLICATEKEYUPDATEc=c+1;更新表SETc=c+1WHEREa=1;如果该行作为新记录插入,则受影响行的值为1;如果原始记录被更新,则受影响的行的值为2。REPLACE语句实现使用REPLACE的最大优点是可以将DELETE和INSERT合二为一,形成一个原子操作。这样,在同时使用DELETE和INSERT的时候就不用考虑添加事务等复杂的操作了。使用REPLACE时,表中必须有唯一索引,且该索引所在字段不能允许空值,否则REPLACE与INSERT完全一样。执行REPLACE后,系统返回受影响的行数。如果返回1,表示表中没有重复记录。如果返回2,则表示存在重复记录。系统自动调用DELETE删除这条记录,然后用INSERT记录插入这条记录。语法与INSERT非常相似,例如,下面的REPLACE语句是插入或更新一条记录。REPLACEINTOusers(id,name,age)VALUES(1,'冰河',18);本文转载自微信公众号「冰河科技」,可通过以下二维码关注。转载本文请联系冰川科技公众号。