【SQL】删除表中重复数据的方法

很久之前我写入一张sql的数据表,它里面有很多重复的内容。然后我想只保留一条原始数据:

例如上面的时间,出现了很多重复值。

我最初用的是这种方法:

sql 复制代码
SELECT * FROM table_name WHERE primary_key IN (
  SELECT max(primary_key)
  FROM table_name 
  GROUP BY noticeTime
  HAVING COUNT(*) > 1
);

我们看看最里面的语句部分:

SELECT min(primary_key ) FROM table_name GROUP BY noticeTime HAVING COUNT(*) > 1

这个部分使用查询使用 GROUP BY对表数据来分组数据,并使用HAVING子句来选择那些title出现次数大于1的行,选出最小的id值出来(因为我是要最原始的时间的内容,id是递增的,所以选最小值,如果是要最新数据的话,则用max)

然后SELECT * FROM table_name WHERE primary_key IN ( 这部分是选出符合不重复这个条件的id。

按理来说,我们是要保留这些id, 要删除 除去这部分id的其他值。

查询not in 是没有问题的,但是一旦对原表进行删减,如 DELETE FROM table_name WHERE primary_key NOT IN (,就会出现下面这个警告:

1093 - You can't specify target table 'table_name ' for update in FROM clause

这个错误的是,我在同一个查询中要更新一个表,但同时又在FROM子句中直接引用这个表。又要查,又要改,就会导致锁表和性能问题。

所以直接建一个新表就好了:

sql 复制代码
CREATE new_table 
SELECT * FROM table_name WHERE primary_key IN (
  SELECT max(primary_key)
  FROM table_name 
  GROUP BY noticeTime
  HAVING COUNT(*) > 1
);
相关推荐
llilian_1637 分钟前
IRIG-B码产生器立足用户痛点,提供精准授时解决方案
大数据·数据库·功能测试·单片机·嵌入式硬件·测试工具
zuoerjinshu6 小时前
sql实战解析-sum()over(partition by xx order by xx)
数据库·sql
NocoBase7 小时前
【2.0 教程】第 1 章:认识 NocoBase ,5 分钟跑起来
数据库·人工智能·开源·github·无代码
Hoshino.419 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
Oueii10 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
未来龙皇小蓝10 小时前
【MySQL-索引调优】11:Group by相关概念
数据库·mysql·性能优化
2401_8318249611 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
njidf11 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
twc82911 小时前
大模型生成 QA Pairs 提升 RAG 应用测试效率的实践
服务器·数据库·人工智能·windows·rag·大模型测试
@我漫长的孤独流浪11 小时前
Python编程核心知识点速览
开发语言·数据库·python