ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql 删除重复数据 保留1条

2021-07-13 10:33:02  阅读:187  来源: 互联网

标签:NAME 删除 重复 age animal mysql id SELECT name


 

创建测试表:

CREATE TABLE `animal` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `boot`.`animal` (`id`, `name`, `age`) VALUES ('1', 'cat', '12');
INSERT INTO `boot`.`animal` (`id`, `name`, `age`) VALUES ('2', 'dog', '13');
INSERT INTO `boot`.`animal` (`id`, `name`, `age`) VALUES ('3', 'camel', '25');
INSERT INTO `boot`.`animal` (`id`, `name`, `age`) VALUES ('4', 'cat', '32');
INSERT INTO `boot`.`animal` (`id`, `name`, `age`) VALUES ('5', 'dog', '42');

1.查看重复name及条数

SELECT NAME,
       count(1)
FROM animal
GROUP BY NAME
HAVING count(1) > 1;

 

 直接删除:

DELETE
-- select *
FROM animal
WHERE NAME IN (
    SELECT NAME
    FROM animal
    GROUP BY NAME
    HAVING count(1) > 1
)

会报错  [Err] 1093 - You can't specify target table 'animal' for update in FROM clause

不能先select出同一表中的某些值,再update这个表(在同一语句中)

原因是:更新这个表的同时又查询了这个表,查询这个表的同时又去更新了这个表,可以理解为死锁。mysql不支持这种更新查询同一张表的操作

2.解决办法:把要删除的数据查询出来做为一个第三方表,然后再删除。

DELETE
-- select *
FROM animal
WHERE NAME IN (
    SELECT t.NAME
    FROM (
             SELECT NAME
             FROM animal
             GROUP BY NAME
             HAVING count(1) > 1
         ) t
)

3.删除表中删除重复数据,仅保留一条

通过name分组,查出id最小的数据,这些数据就是要留下,那么再查询出id不在这里面的,就是要删除的重复数据。

DELETE
-- SELECT    *
FROM animal
WHERE id NOT IN (
    SELECT t.id
    FROM (
             SELECT MIN(id) AS id
             FROM animal
             GROUP BY `name`
         ) t
)

 

标签:NAME,删除,重复,age,animal,mysql,id,SELECT,name
来源: https://www.cnblogs.com/ooo0/p/15005303.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有