MySQL数据库跨多表查找删除重复number值的实现方法求助
问题根因分析
- 原SQL语法错误:
FROM子句中使用AND拼接多张表的写法不符合MySQL规范,无法正确指定数据源 - 逻辑错误:原关联条件
a.id = b.id仅会匹配同ID的行,完全无法检测number字段重复的场景,且未实现跨多表检索的需求
实现步骤
1. 跨多表检测重复number值
把所有涉及number字段的表数据通过UNION ALL汇总后分组统计,即可筛选出重复值:
SELECT number, COUNT(*) AS repeat_count FROM ( SELECT number FROM `SomeoneA` UNION ALL SELECT number FROM `SomeoneB` -- 有其他包含number字段的表,继续往下加UNION ALL即可 ) AS all_numbers GROUP BY number HAVING repeat_count > 1;
运行后返回的所有number值就是全局范围内重复的数值。
2. 删除重复数据(保留其中1条)
如果是单表内部出现number重复,以保留ID最大的条目为例,单表删除语句如下:
-- 处理SomeoneA表内重复 DELETE a FROM `SomeoneA` a INNER JOIN `SomeoneA` b ON a.number = b.number AND a.id < b.id; -- 处理SomeoneB表内重复 DELETE b FROM `SomeoneB` b INNER JOIN `SomeoneB` c ON b.number = c.number AND b.id < c.id;
如果是跨表出现相同number,确认要保留的条目所属表后,直接指定对应表删除即可,示例:
-- 示例:确认number=123需要从SomeoneB表删除 DELETE FROM `SomeoneB` WHERE number = 123;
后续避免重复的方案
如果需要全局保证number字段唯一,建议新增一张全局唯一索引表,写入其他业务表之前先写入该表,利用唯一索引冲突规避重复,比每次全表扫描检测重复的效率高很多:
-- 全局number唯一表建表语句 CREATE TABLE `global_number_unique` ( `number` varchar(64) NOT NULL COMMENT '全局唯一number值', PRIMARY KEY (`number`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
内容的提问来源于stack exchange,提问作者thomas2075
相关产品推荐
相关产品推荐

