如何删除MySQL数据表中近似重复的企业名称记录
MySQL删除近似重复企业名称记录方案
操作前务必先备份全表数据,避免误删无法恢复,备份命令参考:
mysqldump -u 你的数据库用户名 -p 你的数据库名 你的表名 > table_backup.sql
核心思路
你遇到的近似重复是标点、空格差异导致的,先对name字段做标准化处理,消除格式差异后分组,保留ID较小的记录,删除其余重复记录。
步骤1:先查询确认重复记录,避免误删
执行以下查询语句,提前核对重复数据是否符合预期:
SELECT MIN(id) AS 需保留的记录ID, LOWER(TRIM(REGEXP_REPLACE(name, '[,. ]+', ' '))) AS 标准化后企业名, GROUP_CONCAT(id SEPARATOR ',') AS 所有重复记录ID, COUNT(*) AS 重复条数 FROM 你的表名 GROUP BY 标准化后企业名 HAVING 重复条数 > 1;
语句说明:
REGEXP_REPLACE会将名称里的逗号、点、连续空格统一替换为单个空格,再转小写、去除首尾空格,确保相似名称处理后完全一致。
如果你使用的MySQL版本低于8.0,没有REGEXP_REPLACE函数,可以替换为嵌套REPLACE实现:
把REGEXP_REPLACE(name, '[,. ]+', ' ')替换为REPLACE(REPLACE(REPLACE(name, ',', ''), '.', ''), ' ', ' ')即可。
步骤2:执行删除操作
核对查询结果无误后,执行以下删除语句,会自动保留ID最小的记录,删除其余重复的近似记录:
DELETE t1 FROM 你的表名 t1 INNER JOIN 你的表名 t2 ON LOWER(TRIM(REGEXP_REPLACE(t1.name, '[,. ]+', ' '))) = LOWER(TRIM(REGEXP_REPLACE(t2.name, '[,. ]+', ' '))) AND t1.id > t2.id;
后续优化建议
因为你的name字段设置了UNI唯一索引,后续可以新增一个normalized_name字段存储标准化后的企业名称,给该字段加唯一索引,写入新数据时先做标准化处理,从根源避免近似重复数据入库。
内容的提问来源于stack exchange,提问作者technophile_3
相关产品推荐
相关产品推荐

