mysql 删除重复数据 保留1条

 

创建测试表:

复制代码
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
)
复制代码

 

posted @   草木物语  阅读(159)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2019-07-13 Spring Cloud Eureka 服务发现 4.2
2019-07-13 Spring Cloud简介 4.1
2019-07-13 Spring Cloud 如何使用Eureka注册服务 4.2.2
2019-07-13 Spring Boot应用的打包和部署
2019-07-13 Spring Boot与ActiveMQ的集成
点击右上角即可分享
微信分享提示