从Mysql数据库中删除重复的条目

时间:2010-11-04 17:03:55

标签: mysql

我有一个包含三列的表,obj1,obj2(两个varchars)和对象之间的距离。不幸的是,数据的构建方式,我的条目数量增加了一倍,例如,

obj1      obj2       distance
c1        c2         10.5
c2        c1         10.5

我想要的是能够删除列出的其中一个条目。我曾经想过并试图使用Exists子句,但没有运气。我想知道这是否需要存储过程?

任何帮助都会感激不尽! 吉姆

2 个答案:

答案 0 :(得分:1)

mysql> create table doubles(a int,b int,c int);
Query OK, 0 rows affected (0.11 sec)

mysql> insert into doubles values (1,2,10),(2,1,10),(1,3,12),(3,1,12),(2,3,13);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from doubles;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    2 |   10 |
|    2 |    1 |   10 |
|    1 |    3 |   12 |
|    3 |    1 |   12 |
|    2 |    3 |   13 |
+------+------+------+
5 rows in set (0.00 sec)

mysql> DELETE a FROM doubles a JOIN doubles b ON a.a = b.b AND a.b = b.a AND a.a > b.a;
Query OK, 2 rows affected (0.03 sec)

mysql> select * from doubles;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    2 |   10 |
|    1 |    3 |   12 |
|    2 |    3 |   13 |
+------+------+------+
3 rows in set (0.00 sec)

最后一个句子(a.a > b.a)同样可能是a.a < b.a,我们只需要决定哪一个双打应该去。

答案 1 :(得分:-1)

如果您可以保证每一行都有一个“重复”,obj1和obj2值相反,那么您可以通过执行

为每个副本删除一个这样的行
DELETE FROM dist WHERE obj1 > obj2

其中dist是您的表名。

如果您的表中的行obj1等于obj2,那么您可以在(obj1,obj2)上创建唯一索引:

ALTER IGNORE TABLE dist ADD UNIQUE INDEX dist_index (obj1,obj2)

只要不满足唯一索引约束,上面的命令就会从表中删除行。 (obj1等于obj2的第一行,将保留该行,因为仍然满足唯一索引约束。将删除obj1等于obj2的第二行,因为第二行与唯一性约束相矛盾。)

您可以选择保留唯一索引,或者,如果您希望删除它,则命令将为:

ALTER TABLE dist DROP INDEX dist_index