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

MySQL数据库,如何处理重复数据?

时间:2023-03-11 20:38:20 科技观察

前言这是一道基础题。这篇文章是很久以前遇到的情况,后来在研究视频的时候又遇到了,所以总结一下。其实解决是否插入重复数据的问题,一般有两种思路,就像治水一样,第一种是从源头上,第二种是在水流经的途中。我们带着这两个思路继续往下看:问题是在我们的mysql数据库中,经常会出现一些重复的数据。在某些情况下,我们允许重复数据存在,但有时我们也需要删除这些重复数据。我们如何处理它?方法一:防止重复数据。也就是说,我们在重新设计表的时候,应该为这些数据设置一个UNIQUE索引,这样可以保证它在插入时的唯一性,不会出现重复。数据。当然你也可以直接设置为PRIMARYKEY(主键)。效果是一样的。我们来看一个案例:下表没有索引和主键,所以这张表允许存在多条重复记录。创建TABLEStudent(first_nameCHAR(20),last_nameCHAR(20),sexCHAR(10));目前first_name和last_name可以重复。如果不想重复,这里有两个解决方案:1.设置双主键模式CREATETABLEstudent(first_nameCHAR(20)NOTNULL,last_nameCHAR(20)NOTNULL,sexCHAR(10),PRIMARYKEY(last_name,first_name));现在不可能插入重复数据。2.添加唯一索引CREATETABLEStudent(first_nameCHAR(20)NOTNULL,last_nameCHAR(20)NOTNULL,sexCHAR(10)UNIQUE(last_name,first_name));这两种形式看似有一点区别,但是却可以起到相同的作用。此时我们可以插入两条重复的数据,会报错。当然,我们也可以在数据库中验证:SELECTCOUNT(*)asrepetitions,last_name,first_nameFROMstudentGROUPBYlast_name,first_nameHAVINGrepetitions>1;这里我们统计first_name和last_name的重复记录条数,上面两种方式都已经设置了,这里肯定是0。指示。(1)Insertignoreinto会忽略数据库中已有的数据。如果数据库中没有数据,将插入新数据。如果有数据,则跳过该数据。这样就可以保留数据库中已有的数据,达到在空隙中插入数据的目的。(2)insertinto是直接相反的,它会直接插入数据,不管数据库中是否有重复数据。举个例子说明:insertignoreintostudent(last_name,first_name)values('张三','李四');//结果QueryOK,1rowsaffected(0.00sec)insertignoreintostudent(last_name,first_name)values('张三','李四'si'');//结果QueryOK,0rowsaffected(0.00sec)现在可以看到了,也就是说第一次插入操作的时候,如果没有数据库,直接插入一条新记录,所以arowofrecords受到影响,但是在第二次插入时,数据库中已经有相同的记录,所以不会插入,0行会受到影响。当然,还有一条指令也可以执行类似的功能,就是insertignoreinto,那就是replaceinto。他说如果有相同primaryorunique的记录,会先删除。然后插入一条新记录。方法三:过滤重复数据如果需要读取不重复的数据,可以在SELECT语句中使用DISTINCT关键字来过滤重复数据。SELECTDISTINCTlast_name,first_nameFROMstudentORDERBYlast_name;也可以使用GROUPBY读取数据表中不重复的数据:SELECTlast_name,first_nameFROMstudentGROUPBY(last_name,first_name);方法四:删除重复数据这种情况其实相当于水到渠成的解决。看下面的sql语句://根据student创建临时表,使用groupby过滤重复数据//根据student创建临时表,使用groupby过滤重复数据CREATETABLEtmpSELECTlast_name,first_name,sexFROMstudent;;//删除原来的学生表DROPTABLEStudent;//重命名这张临时表ALTERTABLEtmpRENAMETOstu;当然也可以在数据表中加入INDEX(索引)和PRIMAYKEY(主键)来删除表中的重复记录。方法如下:ALTERIGNORETABLEStudentADDPRIMARYKEY(last_name,first_name);OK,解决方法就这么多,相信能解决你的问题。