2012-10-12 58 views
0

我有一个关系表,根据它们的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 
+0

检查这个帖子 - http://stackoverflow.com/questions/2630440/how-to-delete-duplicates-on-mysql-table –

+3

创建一个'UNIQUE'关键另一个(临时)表,然后插入结束,它应该忽略重复。 – Kermit

+1

+1至@njk。我想这里的教训是从不创建没有唯一键的表格,最好是自动增量ID字段。 – Spudley

回答

1

可以有两种色谱柱重复 - 但不能同一行两次

这是表中的约束,你没有im反。约束条件是unique index(a,b)。如果你有索引,你就不会有重复。

恕我直言,你最好的办法是唯一索引添加到表,使用临时表先删除重复:

  1. 复制人person_temp
  2. 删除所有来自person
  3. 添加独特index to person
  4. unique a,bperson_temp复制到`person。
+0

谢谢 - 现在就试试这个。很确定这是我需要做的。 – user82302124

3

这应该工作:

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; 
+0

我不确定这是我想用我的例子 - 我不打算让任何专栏独特? – user82302124

+0

是否担心添加索引,插入重复项时插入记录的代码会失败?你可以通过将'INSERT's改为'INSERT IGNORE'来解决这个问题。 –

1

这就是你如何删除重复行......我会写你我的例子,你需要适用于你的代码。我有一个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) 

它的工作原理,如果你有任何问题,我写回

相关问题