开发背景:最近在做一个批量导入MySQL数据库的功能。从批量导入我们可以知道,这样的数据是不会重复判断的,所以只有在所有的数据都导入完之后,再执行一条语句将其删除,才能保证数据的唯一性。实战:表结构如下图所示:表示:品牌操作:使用SQL查询重复的数据是什么:SELECT*frombrandWHEREbrandNameIN(selectbrandNamefrombrandGROUPBYbrandNameHAVINGCOUNT(brandName)>1#ConditionisquantityDuplicatedatagreaterthan1)使用SQL删除冗余重复数据,保留Id最小的唯一数据:注:报错SQL:DELETEFROMbrandWHEREbrandNameIN(selectbrandNamefrombrandGROUPBYbrandNameHAVINGCOUNT(brandName)>1)ANDIdNOTIN(selectMIN(Id)frombrandGROUPBYbrandNameHAVINGCOUNT(brandName)>1)提示:您不能在FROM子句中为更新指定目标表“品牌”不能指定FROM子句中updates目标表“brand”的原因是:直接查的数据不能作为删除数据的条件。我们应该先用检查到的数据创建一个临时表,然后以临时表为条件删除函数。正确的SQL写法:DELETEFROMbrandWHEREbrandNameIN(SELECTbrandNameFROM(SELECTbrandNameFROMbrandGROUPBYbrandNameHAVINGCOUNT(brandName)>1)e)ANDIdNOTIN(SELECTIdFROM(SELECTMIN(Id)ASIdFROMbrandGROUPBYbrandNameHAVINGCOUNT(brandName)>1)t)#查询显示重复的数据是前几项,所以不需要查询是否为最小值更简单快捷的方式:这个比较方便老飞飞前辈给出的简洁方法写法(非常感谢你的方法):DELETEFROMbrandWHEREIdNOTIN(SELECTIdFROM(SELECTMIN(Id)ASIdFROMbrandGROUPBYbrandName)t)这句话的意思其实是通过分组计算出数据库中不重复的最小数据id号,然后使用notin删除其他冗余数据结果如下图所示:总结:很多东西需要自己一步步摸索。当然网上的建议也是非常有价值的参考和资源。不管我们做什么开发,都需要了解它的工作原理,才能更好的掌握它。
