我的表格结构如下:
table(A, B)
它们都是主键,需要连接另一个表中的两个条目(即它们可以模拟用户之间的友谊)。
我需要查看表格,如果(A,B)存在,则删除最终的(B,A)(反之亦然)。
由于数据库很庞大,我不能每次都为每一个条目手动执行此操作。
当然,我编写了填充数据库的脚本以检查这种情况并避免它,但我们一直在8台不同的PC上使用该脚本,因此不同的转储可能会有“反向重复”。
答案 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
)