天天看點

mysql 删除 重複資料,MySQL資料庫中删除重複記錄的方法總結[推薦]

表結構:

mysql> desc demo;

+-------+------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+------------------+------+-----+---------+----------------+

| id | int(11) unsigned | NO | PRI | NULL | auto_increment |

| site | varchar(100) | NO | MUL | | |

+-------+------------------+------+-----+---------+----------------+

2 rows in set (0.00 sec)

資料:

mysql> select * from demo order by id;

+----+------------------------+

| id | site |

+----+------------------------+

| 1 | http://www.CodeBit.cn |

| 2 | http://YITU.org |

| 3 | http://www.ShuoWen.org |

| 4 | http://www.CodeBit.cn |

| 5 | http://www.ShuoWen.org |

+----+------------------------+

5 rows in set (0.00 sec)

當沒有建立表或建立索引權限的時候,可以用下面的方法:

如果你要删除較舊的重複記錄,可以使用下面的語句:

mysql> delete from a

-> using demo as a, demo as b

-> where (a.id > b.id)

-> and (a.site = b.site);

Query OK, 2 rows affected (0.12 sec)

mysql> select * from demo order by id;

+----+------------------------+

| id | site |

+----+------------------------+

| 1 | http://www.CodeBit.cn |

| 2 | http://YITU.org |

| 3 | http://www.ShuoWen.org |

+----+------------------------+

3 rows in set (0.00 sec)

如果你要删除較新的重複記錄,可以使用下面的語句:

mysql> delete from a

-> using demo as a, demo as b

-> where (a.id < b.id)

-> and (a.site = b.site);

Query OK, 2 rows affected (0.12 sec)

mysql> select * from demo order by id;

+----+------------------------+

| id | site |

+----+------------------------+

| 2 | http://YITU.org |

| 4 | http://www.CodeBit.cn |

| 5 | http://www.ShuoWen.org |

+----+------------------------+

3 rows in set (0.00 sec)

你可以用下面的語句先确認将被删除的重複記錄:

mysql> SELECT a.*

-> FROM demo a, demo b

-> WHERE a.id > b.id

-> AND (a.site = b.site);

+----+------------------------+

| id | site |

+----+------------------------+

| 1 | http://www.CodeBit.cn |

| 3 | http://www.ShuoWen.org |

+----+------------------------+

2 rows in set (0.00 sec)

如果有建立索引的權限,可以用下面的方法:

在表上建立唯一鍵索引:

?

重複記錄被删除後,如果需要,可以删除索引:

?

如果有建立表的權限,可以用下面的方法:

建立一個新表,然後将原表中不重複的資料插入新表:

?

然後将原表備份,将新表重命名為目前表:

?

注意:使用這種方式建立的表會丢失原表的索引資訊!

?

如果要保持和原表資訊一緻,你可以使用 show create table demo; 來檢視原表的建立語句,然後使用原表的建立語句建立新表,接着使用 insert … select 語句插入資料,再重命名表即可。

當然,如果要避免重複記錄,最好的辦法還是不要插入重複資料,可以參考本站另外一篇文章:MySQL 當記錄不存在時插入