2012-10-12 71 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) 

它的工作原理,如果你有任何問題,我寫回

相關問題