You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询实现:删除公司表相似名称行并同步更新关联详情表(无数据丢失)

需求可实现!对应的MySQL解决方案

当然可以完成这个需求——既要清理公司表中名称相似的重复记录(保留每组最小ID),又要同步更新关联的详情表,确保数据不丢失。下面是一步步的实现方案:

核心思路

  1. 识别相似分组:先把名称相似的公司归为一组,确定每组要保留的最小ID;
  2. 同步更新详情表:将详情表中属于同一组的所有记录的companyID替换为组内保留的最小ID;
  3. 清理冗余公司记录:删除公司表中不属于保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:02:46