MySQL查询实现:删除公司表相似名称行并同步更新关联详情表(无数据丢失)
需求可实现!对应的MySQL解决方案
当然可以完成这个需求——既要清理公司表中名称相似的重复记录(保留每组最小ID),又要同步更新关联的详情表,确保数据不丢失。下面是一步步的实现方案:
核心思路
- 识别相似分组:先把名称相似的公司归为一组,确定每组要保留的最小ID;
- 同步更新详情表:将详情表中属于同一组的所有记录的
companyID替换为组内保留的最小ID; - 清理冗余公司记录:删除公司表中不属于保留ID的冗余条目。
具体SQL语句
步骤1:创建临时表标记每组的保留ID
首先我们用临时表存储每个相似名称组对应的最小公司ID,这里通过正则统一名称格式来识别相似组(针对你的示例数据调整,实际场景可按需修改正则规则):
CREATE TEMPORARY TABLE company_groups AS SELECT MIN(id) AS keep_id, -- 统一名称格式:转小写、去掉撇号/结尾的s、去掉末尾的corp TRIM( REGEXP_REPLACE( LOWER(name), '[\\'’s]|\\s+corp$', '' ) ) AS group_key FROM companies GROUP BY group_key;
步骤2:更新详情表的companyID
把详情表中所有属于同一相似组的记录,关联到组内要保留的最小ID:
UPDATE company_details cd JOIN companies c ON cd.companyID = c.id JOIN company_groups cg ON cg.group_key = TRIM(REGEXP_REPLACE(LOWER(c.name), '[\\'’s]|\\s+corp$', '')) SET cd.companyID = cg.keep_id;
步骤3:删除公司表的冗余记录
移除公司表中不在保留ID列表里的条目:
DELETE c FROM companies c LEFT JOIN company_groups cg ON c.id = cg.keep_id WHERE cg.keep_id IS NULL;
注意事项
- 正则规则调整:上面的正则是针对你的示例数据设计的(处理
Ions Comp's、Lamar这类情况),如果实际业务中相似名称的规则不同(比如包含其他特殊字符、前缀后缀),需要修改REGEXP_REPLACE的匹配模式; - 数据备份:执行删除/更新操作前,务必先备份数据,或者在测试环境验证逻辑;
- 索引优化:如果表数据量较大,建议给
company_details.companyID、companies.id建立索引,提升JOIN操作的效率。
内容的提问来源于stack exchange,提问作者Prince Paraste
相关产品推荐
相关产品推荐

