【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
);
相关推荐
liliangcsdn3 分钟前
如何利用约束提示优化LLM在问题转sql的一致性
数据库·sql
Java爱好狂.44 分钟前
分布式ID|从源码角度深度解析美团Leaf双Buffer优化方案
java·数据库·分布式·分布式id·es·java面试·java程序员
Elastic 中国社区官方博客1 小时前
通过混合搜索重排序提升多语言嵌入模型的相关性
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
倔强的石头1062 小时前
KingbaseES:从兼容到超越,详解超越MySQL的权限隔离与安全增强
数据库·mysql·安全·金仓数据库
小鸡毛程序员2 小时前
我在CSDN学MYSQL之----数据库基本概念和基本知识(下)
数据库·mysql
程序定小飞3 小时前
基于springboot的web的音乐网站开发与设计
java·前端·数据库·vue.js·spring boot·后端·spring
小灰灰搞电子3 小时前
Rust 操作Sqlite数据库详细教程
数据库·rust·sqlite
武昌库里写JAVA3 小时前
element-ui 2.x 及 vxe-table 2.x 使用 css 定制主题
java·vue.js·spring boot·sql·学习
IvorySQL3 小时前
你真的知道你正在运行哪个 PostgreSQL吗?
数据库·postgresql
l1t4 小时前
利用DeepSeek采用hugeint转字符串函数完善luadbi-duckdb的decimal处理
数据库·lua·c·duckdb·deepseek