我有一个关系表,根据它们的ID连接两个其他表。对于两列可以有重复 - 但不能有两次相同的行。我处理检查代码的一面。删除重复的行,没有唯一的键 - 关系表
如何删除重复的行(见下文):
select * from people:
a | b
1 2
1 3
1 3
1 7
2 3
2 5
2 5
2 9
我想要得到的结果是:
a | b
1 2
1 3
1 7
2 3
2 5
2 9
我有一个关系表,根据它们的ID连接两个其他表。对于两列可以有重复 - 但不能有两次相同的行。我处理检查代码的一面。删除重复的行,没有唯一的键 - 关系表
如何删除重复的行(见下文):
select * from people:
a | b
1 2
1 3
1 3
1 7
2 3
2 5
2 5
2 9
我想要得到的结果是:
a | b
1 2
1 3
1 7
2 3
2 5
2 9
可以有两种色谱柱重复 - 但不能同一行两次
这是表中的约束,你没有im反。约束条件是unique index
(a,b)
。如果你有索引,你就不会有重复。
恕我直言,你最好的办法是唯一索引添加到表,使用临时表先删除重复:
person_temp
person
person
unique a,b
从person_temp
复制到`person。谢谢 - 现在就试试这个。很确定这是我需要做的。 – user82302124
这应该工作:
ALTER IGNORE TABLE people ADD UNIQUE (a,b);
如果你不不想添加索引,那么这应该工作:
DROP TABLE IF EXISTS people_old;
DROP TABLE IF EXISTS people_new;
CREATE TABLE people_new LIKE people;
INSERT INTO people_new SELECT DISTINCT * FROM people;
RENAME TABLE people TO people_old, people_new TO people;
我不确定这是我想用我的例子 - 我不打算让任何专栏独特? – user82302124
是否担心添加索引,插入重复项时插入记录的代码会失败?你可以通过将'INSERT's改为'INSERT IGNORE'来解决这个问题。 –
这就是你如何删除重复行......我会写你我的例子,你需要适用于你的代码。我有一个ID演员表,我想反复FIRST_NAME删除行
mysql> select actor_id, first_name from actor_2;
+----------+-------------+
| actor_id | first_name |
+----------+-------------+
| 1 | PENELOPE |
| 2 | NICK |
| 3 | ED |
....
| 199 | JULIA |
| 200 | THORA |
+----------+-------------+
200 rows in set (0.00 sec)
- 现在我使用了一个名为@a变量获得ID下一行是否具有相同的FIRST_NAME(重复,无效,如果它是不)。
mysql> select if([email protected],actor_id,null) as first_names,@a:=first_name from actor_2 order by first_name;
+---------------+----------------+
| first_names | @a:=first_name |
+---------------+----------------+
| NULL | ADAM |
| 71 | ADAM |
| NULL | AL |
| NULL | ALAN |
| NULL | ALBERT |
| 125 | ALBERT |
| NULL | ALEC |
| NULL | ANGELA |
| 144 | ANGELA |
...
| NULL | WILL |
| NULL | WILLIAM |
| NULL | WOODY |
| 28 | WOODY |
| NULL | ZERO |
+---------------+----------------+
200 rows in set (0.00 sec)
- 现在我们只能得到复制ID:
mysql> select first_names from (select if([email protected],actor_id,null) as first_names,@a:=first_name from actor_2 order by first_name) as t1;
+-------------+
| first_names |
+-------------+
| NULL |
| 71 |
| NULL |
...
| 28 |
| NULL |
+-------------+
200 rows in set (0.00 sec)
-the最后一步,让我们删除!
mysql> delete from actor_2 where actor_id in (select first_names from (select if([email protected],actor_id,null) as first_names,@a:=first_name from actor_2 order by first_name) as t1);
Query OK, 72 rows affected (0.01 sec)
- 现在可以检查我们的表:
mysql> select count(*) from actor_2 group by first_name;
+----------+
| count(*) |
+----------+
| 1 |
| 1 |
| 1 |
...
| 1 |
+----------+
128 rows in set (0.00 sec)
它的工作原理,如果你有任何问题,我写回
检查这个帖子 - http://stackoverflow.com/questions/2630440/how-to-delete-duplicates-on-mysql-table –
创建一个'UNIQUE'关键另一个(临时)表,然后插入结束,它应该忽略重复。 – Kermit
+1至@njk。我想这里的教训是从不创建没有唯一键的表格,最好是自动增量ID字段。 – Spudley