我有一张这样的表:
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| v1 | int(11) | YES | MUL | NULL | |
| v2 | int(11) | YES | MUL | NULL | |
+-------+---------+------+-----+---------+-------+
此表中存在大量重复。例如,以下元素:
+------+------+
| v1 | v2 |
+------+------+
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
| 1 | 6 |
| 1 | 7 |
| 1 | 8 |
| 1 | 9 |
| 2 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 1 |
| 7 | 1 |
| 8 | 1 |
| 9 | 1 |
+------+------+
该表很大,有1540000个条目。要删除冗余条目(即获得只有(1,9)和没有(9,1)条目的表),我想用子查询来做这件事,但是有更好的方法吗?
答案 0 :(得分:0)
警告:这些命令会修改您的数据库。确保您有备份副本,以便在必要时可以再次恢复数据。
您可以添加v1必须小于v2的要求,这将大约减少一半的存储需求。您可以确保数据库中的所有行都满足此条件并重新排序那些不具备的行,并在同时包含其中一行时删除它们。
此查询将插入您所拥有的任何缺失行,例如(5,1)但不是(1,5):
INSERT INTO table1
SELECT T1.v2, T1.v1
FROM table1 T1
LEFT JOIN table1 T2
ON T1.v1 = T2.v2 AND T1.v2 = T2.v1
WHERE T1.v1 > T1.v2 AND T2.v1 IS NULL
然后此查询删除您不想要的行,如(5,1):
DELETE table1 WHERE v1 > v2
您可能需要更改代码中添加此约束之前编程的其他位置。
答案 1 :(得分:0)
实际上,@ Mark的方法也会奏效。我只是想出了另一种方法,并且想知道我是否也可以对此做出一些反馈。我测试了它,似乎工作得很快。
SELECT v1,v2 FROM table WHERE v1<v2 UNION SELECT v2,v1 FROM table WHERE v1>v2;
如果这是正确的,您可以随时创建一个新表:
CREATE TABLE newtable AS SELECT v1,v2 FROM edges WHERE v1<v2 UNION SELECT v2,v1 FROM edges WHERE v1>v2;