mysql删除数据库重复记录实现方法

小浪SEO博客 专注SEO优化思维、SEO技术的实战分享类博客~

文章详细的利用了一个实例来告诉我们如何在mysql删除数据库重复记录的实现方法与原理,有需要的同学可以参考一下.

演示数据,表结构,代码如下:

  1. mysql>descdemo;
  2. +-------+------------------+------+-----+---------+----------------+
  3. |Field|Type|Null|Key|Default|Extra|
  4. +-------+------------------+------+-----+---------+----------------+
  5. |id|int(11)unsigned|NO|PRI|NULL|auto_increment|
  6. |site|varchar(100)|NO|MUL|||
  7. +-------+------------------+------+-----+---------+----------------+
  8. 2rowsinset(0.00sec)
  9. --数据:
  10. mysql>select*fromdemoorderbyid;
  11. +----+------------------------+
  12. |id|site|
  13. +----+------------------------+
  14. |1|http://www.phpfensi.com |
  15. |2||
  16. |3|http://www.phpfensi.com |
  17. |4|http://www.phpfensi.com |
  18. |5|http://www.phpfensi.com |
  19. +----+------------------------+
  20. 5rowsinset(0.00sec)

当没有创建表或创建索引权限的时候,如果你要删除较旧的重复记录,可以使用下面的语句:

  1. mysql>deletefroma
  2. ->usingdemoasa,demoasb
  3. ->where(a.id>b.id)
  4. ->and(a.site=b.site);
  5. QueryOK,2rowsaffected(0.12sec)
  6. mysql>select*fromdemoorderbyid;
  7. +----+------------------------+
  8. |id|site|
  9. +----+------------------------+
  10. |1|http://www.phpfensi.com |
  11. |2||
  12. |3|http://www.phpfensi.com |
  13. +----+------------------------+
  14. 3rowsinset(0.00sec)

你要删除较新的重复记录,可以使用下面的语句:

  1. mysql>deletefroma
  2. ->usingdemoasa,demoasb
  3. ->where(a.id<b.id)
  4. ->and(a.site=b.site);
  5. QueryOK,2rowsaffected(0.12sec)
  6. mysql>select*fromdemoorderbyid;
  7. +----+------------------------+
  8. |id|site|
  9. +----+------------------------+
  10. |2||
  11. |4|http://www.phpfensi.com |
  12. |5|http://www.phpfensi.com |
  13. +----+------------------------+
  14. 3rowsinset(0.00sec)

你可以用下面的语句先确认将被删除的重复记录,代码如下:

  1. mysql>SELECTa.*
  2. ->FROMdemoa,demob
  3. ->WHEREa.id>b.id
  4. ->AND(a.site=b.site);
  5. +----+------------------------+
  6. |id|site|
  7. +----+------------------------+
  8. |1|http://www.phpfensi.com |
  9. |3|http://www.phpfensi.com |
  10. +----+------------------------+
  11. 2rowsinset(0.00sec)

如果有创建索引的权限,可以用下面的方法,在表上创建唯一键索引,代码如下:

  1. mysql>alterignoretabledemoadduniqueindexukey(site);
  2. QueryOK,5rowsaffected(0.46sec)
  3. Records:5Duplicates:2Warnings:0
  4. mysql>select*fromdemoorderbyid;
  5. +----+------------------------+
  6. |id|site|
  7. +----+------------------------+
  8. |1|http://www.phpfensi.com |
  9. |2||
  10. |3|http://www.phpfensi.com |
  11. +----+------------------------+
  12. 3rowsinset(0.00sec)

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

  1. mysql>altertabledemodropindexukey;
  2. QueryOK,3rowsaffected(0.37sec)
  3. Records:3Duplicates:0Warnings:0

如果有创建表的权限,可以用下面的方法,创建一个新表,然后将原表中不重复的数据插入新表,代码如下:

  1. mysql>createtabledemo_newasselect*fromdemogroupbysite;
  2. QueryOK,3rowsaffected(0.19sec)
  3. Records:3Duplicates:0Warnings:0
  4. mysql>showtables;
  5. +----------------+
  6. |Tables_in_test|
  7. +----------------+
  8. |demo|
  9. |demo_new|
  10. +----------------+
  11. 2rowsinset(0.00sec)
  12. mysql>select*fromdemoorderbyid;
  13. +----+------------------------+
  14. |id|site|
  15. +----+------------------------+
  16. |1|http://www.phpfensi.com |
  17. |2||
  18. |3|http://www.phpfensi.com |
  19. |4|http://www.phpfensi.com |
  20. |5|http://www.phpfensi.com |
  21. +----+------------------------+
  22. 5rowsinset(0.00sec)
  23. mysql>select*fromdemo_neworderbyid;
  24. +----+------------------------+
  25. |id|site|
  26. +----+------------------------+
  27. |1|http://www.phpfensi.com |
  28. |2||
  29. |3|http://www.phpfensi.com |
  30. +----+------------------------+
  31. 3rowsinset(0.00sec)

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

  1. mysql>renametabledemotodemo_old,demo_newtodemo;
  2. QueryOK,0rowsaffected(0.04sec)
  3. mysql>showtables;
  4. +----------------+
  5. |Tables_in_test|
  6. +----------------+
  7. |demo|
  8. |demo_old|
  9. +----------------+
  10. 2rowsinset(0.00sec)
  11. mysql>select*fromdemoorderbyid;
  12. +----+------------------------+
  13. |id|site|
  14. +----+------------------------+
  15. |1|http://www.phpfensi.com |
  16. |2||
  17. |3|http://www.phpfensi.com |
  18. +----+------------------------+
  19. 3rowsinset(0.00sec)

注意:使用这种方式创建的表会丢失原表的索引信息,代码如下:

  1. mysql>descdemo;
  2. +-------+------------------+------+-----+---------+-------+
  3. |Field|Type|Null|Key|Default|Extra|
  4. +-------+------------------+------+-----+---------+-------+
  5. |id|int(11)unsigned|NO||0||
  6. |site|varchar(100)|NO||||
  7. +-------+------------------+------+-----+---------+-------+
  8. 2rowsinset(0.00sec)

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

相关广告
  • mysql删除数据库重复记录实现方法 mysql删除数据库重复记录实现方法 mysql删除数据库重复记录实现方法
相关阅读

mysql删除数据库重复记录实现方法

2019/10/10 17:33:05 | 谷歌SEO算法 | 挖矿