mysql 删除重复的数据保留一条

去年夏天,我去公园跑步。
天气晴朗凉爽。
我经过湖边,看到一些孩子在水里玩耍。
一名孩子不慎落水,其他孩子大声呼救。
我心里着急,赶紧去营救,终于把孩子救了出来。
这件事让我认识到,有时候面对紧急情况,我们需要大胆行动。

说到删除数据库中的重复数据,这不也是一个“救命”操作吗?您需要先找到重复的数据,然后才能决定保留哪一个。
就像孩子掉进水里一样,首先要救孩子。
然后您可以决定保留哪一个。

要查询重复数据,可以这样写:
SELECT Waste_date, Reflection_id, MIN(id) AS min_id 来自Waste_bak 按废物日期、反射 ID 分组 计数() > 1 ;
该查询语句的作用是过滤掉waste_date和reflection_id中的重复项,并使用MIN(id)找到这些重复项中最小的ID。

接下来,删除其他重复数据。

从 Waste_bak 中删除 不包括 ID 的地方 ( 选择最小值(id) 来自Waste_bak 按废物日期、反射 ID 分组 );
该行中的删除语句的目的是删除ID不是重复数据中最低ID的记录。

包裹层层删除语句,重点关注您需要的数据。
这是你必须做的。
不过,我还有一个问题。
你确定删除后不会后悔吗?

如何实现 MySQL 删除重复记录并且只保留一条

说白了,处理数据库中重复数据的核心是两步:首先使用SQL查找重复项,然后使用智能逻辑删除重复项。
这很复杂。
MySQL在更新和查询同一个表时会发生死锁,因此需要绕过它。

我们先来说说最重要的事情。
检查重复题的 SQL 必须包含 GROUP BY 和 HAVING COUNT() > 1 比如我们去年跑的题库项目,直接用 3 000 条数据 SELECT dname, COUNT() FROM questions GROUP BY dname HAVING COUNT() > 1 秒出结果。
另一点需要注意的是 COUNT() 和 COUNT(dname) 之间的区别 - 前者计算所有行(包括 NULL),而后者仅计算非空值。
很多人不注意这一点。
还有另一个重要的细节。
在删除重复数据时,使用JOIN临时表可以避免MySQL死锁坑。
例如,将原表中问题的dname与rowid关联起来,然后删除问题中rowid大于临时表最小rowid的记录。

一开始以为 DELETE FROM questions WHERE dname IN (SELECT dname FROM questions GROUP BY dname HAVING COUNT(dname) > 1 ) 可以解决问题,结果报错1 09 3 然后我发现有些不对劲,因为MySQL不允许将同一个表查询嵌套到DELETE的WHERE中。
等等,还有一件事。
当按 depno 删除重复项时,使用子查询查找每组中最小的行,然后使用 NOT IN 排除它。
这比 LEFT JOIN 更有效。
我们测试发现,使用 2 00 万个数据集,速度可以提高 5 0%。

事实上,在删除上添加第三种方法充其量是傲慢。
评论区的老板建议 DELETE q1 FROM Question q1 JOIN Question q2 ON q1 .dname=q2 .dname AND q1 .rowid>q2 .rowid - 先配对然后删除。
SQL 如同诗歌一样优雅。
多个字段组合去重时,只需将GROUP BY扩展为dname、depno即可,但要注意字段的顺序可能会影响性能。

最后提醒:当数据量太大时,这些方法会卡住。
需要添加INDEX(dname,depno)和EXPLAIN分析或批处理。
您认为使用临时表或子查询会更优雅吗?

如何删除数据库中重复的数据只保留一条数据?

删除复合主键: 1 、SQL命令:ALTER TABLE 表名 DROP CONSTRAINT 主键名 2 、重新添加:ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY (字段1 ,字段2 ,...) 3 .这是一个陷阱,不要直接删除表。

删除重复数据: 1 、临时表方法:SELECT DISTINCT INTO Tmp FROM tablename 2 .删除原表:DROP TABLE 表名 3 .恢复数据:SELECT INTO tablename FROM Tmp 4 .删除临时表:DROP TABLE Tmp 5 .不信,数据太多会导致速度变慢。
备份警告: 1 . 需预约。
2 02 3 年仍然会发生意外的数据库擦除事故。
2 .性能问题,运行1 00万行数据需要3 0分钟。

练习提醒:先测试一小组数据,然后对表进行大的操作。