MySQL 8表中含多余空格的重复姓名记录删除方案咨询
解决MySQL中带空格前缀姓名重复记录的删除方法
核心思路
只针对以MC 、MR 这类前缀开头的错误记录,匹配对应的无空格正确记录后删除错误项,避免误删其他正常带空格的姓名(比如名字和中间名之间的空格)。
步骤1:先识别要删除的错误记录
假设你的表名为person,姓名字段为full_name,主键为id。先执行以下查询,确认哪些是需要删除的重复记录:
SELECT p1.id AS 待删除记录ID, p1.full_name AS 错误姓名, p2.id AS 保留记录ID, p2.full_name AS 正确姓名 FROM person p1 JOIN person p2 ON REPLACE(p1.full_name, 'MC ', 'MCC') = p2.full_name WHERE p1.full_name LIKE 'MC %' UNION ALL SELECT p1.id AS 待删除记录ID, p1.full_name AS 错误姓名, p2.id AS 保留记录ID, p2.full_name AS 正确姓名 FROM person p1 JOIN person p2 ON REPLACE(p1.full_name, 'MR ', 'MRR') = p2.full_name WHERE p1.full_name LIKE 'MR %';
这段SQL会把所有MC 开头的错误记录和对应的MCC开头的正确记录配对,同理处理MR 开头的情况。
步骤2:删除错误记录
确认查询结果无误后,执行删除操作。建议用事务包裹,避免误删后无法恢复:
-- 开启事务 START TRANSACTION; -- 删除错误记录 DELETE p1 FROM person p1 JOIN person p2 ON (p1.full_name LIKE 'MC %' AND REPLACE(p1.full_name, 'MC ', 'MCC') = p2.full_name) OR (p1.full_name LIKE 'MR %' AND REPLACE(p1.full_name, 'MR ', 'MRR') = p2.full_name) WHERE p1.id <> p2.id; -- 确保只删除错误的那条,保留正确记录 -- 检查删除结果(比如再执行步骤1的查询,确认无匹配记录) -- 确认无误后提交事务 COMMIT;
注意事项
- 先备份数据:执行删除前务必备份整张表,或者导出待删除记录,防止误操作。
- 扩展前缀范围:如果还有其他类似前缀(如
MAC),可以在SQL中添加对应的OR条件,比如(p1.full_name LIKE 'MAC %' AND REPLACE(p1.full_name, 'MAC ', 'MAC') = p2.full_name)(根据实际正确格式调整)。 - 处理无对应正确记录的情况:如果某些带空格的记录没有对应的无空格版本,你可能需要先修正这些记录(比如替换前缀后的空格),而不是直接删除。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

