检查数据库中的重复项并删除它们

时间:2010-12-15 12:01:22

标签: mysql database duplicates

我的表格结构如下:

table(A, B)

它们都是主键,需要连接另一个表中的两个条目(即它们可以模拟用户之间的友谊)。

我需要查看表格,如果(A,B)存在,则删除最终的(B,A)(反之亦然)。
由于数据库很庞大,我不能每次都为每一个条目手动执行此操作。

当然,我编写了填充数据库的脚本以检查这种情况并避免它,但我们一直在8台不同的PC上使用该脚本,因此不同的转储可能会有“反向重复”。

1 个答案:

答案 0 :(得分:1)

问题出现了,因为您尝试描述的关系是对称的 - 但架构模拟了非对称关联。模拟问题的权利是维护一个关系表 - 然后有一个表将用户与关系联系起来,例如。

relationship:
   id auto_increment

related:
   r_id foreign key references relationship.id
   u_id foreign key references user.id
   primary key (r_id, u_id)

但要清理现有数据......显而易见的方法是......

DELETE FROM yourtable d
WHERE A>B AND EXISTS (
    SELECT 1 
    FROM yourtable r
    WHERE r.A=d.B
    AND r.B =d.A
)

但是,如果我没记错,MySQL不喜欢在删除中使用与删除相同的表中的子选择。所以....

SELECT d.A,d.B 
INTO dups
FROM yourtable d, yourtable r
WHERE d.A>d.B
AND r.A=d.B
AND r.B =d.A;

然后...

DELETE FROM yourtable
WHERE EXISTS (
 SELECT 1 FROM dups
 WHERE dups.A=yourtable.A
 AND dups.B=yourtable.B
)

不确定推送的谓词是否仍然会导致问题,所以如果这不起作用......

DELETE FROM yourtable
WHERE CONCAT(A, '/', B) IN (
 SELECT CONCAT(A, '/' B) FROM dups
)