视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mysql删除数据库重复记录实现方法
2020-11-09 09:55:47 责编:小采
文档

文章详细的利用了一个实例来告诉我们如何在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> * from demo order by id;

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

| id | site |

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

| 1 | http://www.111cn.net |

| 2 | |

| 3 | http://www.zhutiai.com |

| 4 | http://www.111cn.net |

| 5 | http://www.zhutiai.com |

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

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.111cn.net |

| 2 | |

| 3 | http://www.zhutiai.com |

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

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 | |

| 4 | http://www.111cn.net |

| 5 | http://www.zhutiai.com |

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

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.111cn.net |

| 3 | http://www.zhutiai.com |

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

2 rows in set (0.00 sec)


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

在表上创建唯一键索引:

代码如下

mysql> alter ignore table demo add unique index ukey (site);

Query OK, 5 rows affected (0.46 sec)

Records: 5 Duplicates: 2 Warnings: 0

mysql> select * from demo order by id;

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

| id | site |

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

| 1 | http://www.111cn.net |

| 2 | |

| 3 | http://www.zhutiai.com |

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

3 rows in set (0.00 sec)


重复记录被删除后,如果需要,可以删除索引:

代码如下


mysql> alter table demo drop index ukey;

Query OK, 3 rows affected (0.37 sec)

Records: 3 Duplicates: 0 Warnings: 0


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

创建一个新表,然后将原表中不重复的数据插入新表:

代码如下

mysql> create table demo_new as select * from demo group by site;

Query OK, 3 rows affected (0.19 sec)

Records: 3 Duplicates: 0 Warnings: 0

mysql> show tables;

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

| Tables_in_test |

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

| demo |

| demo_new |

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

2 rows in set (0.00 sec)

mysql> select * from demo order by id;

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

| id | site |

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

| 1 | http://www.111cn.net |

| 2 | |

| 3 | http://www.zhutiai.com |

| 4 | http://www.111cn.net |

| 5 | http://www.zhutiai.com |

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

5 rows in set (0.00 sec)

mysql> select * from demo_new order by id;

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

| id | site |

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

| 1 | http://www.111cn.net |

| 2 | |

| 3 | http://www.zhutiai.com |

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

3 rows in set (0.00 sec)


然后将原表备份,将新表重命名为当前表:

代码如下

mysql> rename table demo to demo_old, demo_new to demo;

Query OK, 0 rows affected (0.04 sec)

mysql> show tables;

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

| Tables_in_test |

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

| demo |

| demo_old |

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

2 rows in set (0.00 sec)

mysql> select * from demo order by id;

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

| id | site |

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

| 1 | http://www.111cn.net |

| 2 | |

| 3 | http://www.zhutiai.com |

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

3 rows in set (0.00 sec)


注意:使用这种方式创建的表会丢失原表的索引信息!

代码如下

mysql> desc demo;

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

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

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

| id | int(11) unsigned | NO | | 0 | |

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

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

2 rows in set (0.00 sec)


如果要保持和原表信息一致,你可以使用 show create table demo; 来查看原表的创建语句,然后使用原表的创建语句创建新表,接着使用 insert … select 语句插入数据,再重命名表即可。

下载本文
显示全文
专题