【发布时间】:2010-09-20 05:41:52
【问题描述】:
在一个表中,我有三列 - id、name 和 count。很多名称列是相同的(由于早期缺少 UNIQUE),我想解决这个问题。但是,其他(我认为 4 或 5 个 - 我将不得不检查文档)表使用 id 列来查找名称,并且仅删除它们会破坏事情。那么有没有一种好的、简洁的方式来表达“找到所有相同的记录并将它们合并在一起”?
【问题讨论】:
标签: sql mysql dirty-data
在一个表中,我有三列 - id、name 和 count。很多名称列是相同的(由于早期缺少 UNIQUE),我想解决这个问题。但是,其他(我认为 4 或 5 个 - 我将不得不检查文档)表使用 id 列来查找名称,并且仅删除它们会破坏事情。那么有没有一种好的、简洁的方式来表达“找到所有相同的记录并将它们合并在一起”?
【问题讨论】:
标签: sql mysql dirty-data
这类问题时不时出现。不,没有真正干净的方法来做到这一点。您必须先更改子表中依赖于父表中不需要的值的所有行,然后才能消除父表中不需要的行。
MySQL 支持多表 UPDATE 和 DELETE 语句(与其他品牌的数据库不同),因此您可以执行以下一些非常巧妙的技巧:
UPDATE names n1
JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name)
JOIN child_table c ON (n2.id = c.id)
SET c.name_id = n1.id
ORDER BY n1.id DESC;
在所有子表上完成此操作后,您可以使用 MySQL 的多表 DELETE 语法删除父表中不需要的行:
DELETE FROM n2
USING names n1 JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name);
【讨论】:
为什么你不能做类似的事情
update dependent_table set name_id = <id you want to keep> where name_id in (
select id from names where name = 'foo' and id != <id you want to keep>)
【讨论】: