【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
);
相关推荐
我爱学习好爱好爱2 分钟前
Prometheus监控栈 监控Springboot2+Vue3+redis项目
数据库·redis·prometheus
高一要励志成为佬8 分钟前
【数据库】第一章:绪论
数据库
潇湘梦19 分钟前
mysql团队编写规范
数据库·mysql·代码规范
zhengfei61123 分钟前
开源网站安全监测系统—Libra
数据库·安全·oracle
点云SLAM27 分钟前
boost中graph_traits和adjacency_list 的内存布局以及最小图示例
数据结构·数据库·图论·boost库·最小图·链接矩阵·graph_traints技术
微风中的麦穗27 分钟前
K8s(kubernetes)部署Mivus向量数据库集群 在线和离线两种部署方式
数据库
Go高并发架构_王工29 分钟前
Redis命令执行原理与源码分析:深入理解内部机制
数据库·redis·后端
佛系DBA31 分钟前
数据库性能之旅(四)关于NULL值
数据库·postgresql
学习3人组35 分钟前
Conda虚拟环境迁移指南导出依赖库并跨设备重建环境
java·数据库·conda
hgz071040 分钟前
MySQL索引数据结构:B+树 vs 哈希索
数据库·sql·mysql