【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
);
相关推荐
oradh3 小时前
Oracle TX 锁 Mode 4(Share)问题排查总结
数据库·oracle·tx 锁 mode 4·oracle tx 锁
2601_962065254 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
yi.Ist4 小时前
数据定义语言-DDL操作
数据库·学习·mysql·oracle·大海豚
2601_963282775 小时前
工程项目、政企采购为什么优先选择对讲机批量采购?
数据库
Doraemomo6 小时前
SQLite数据库
数据库·sqlite
云贝教育-郑老师6 小时前
MySQL 的“黑匣子“:Performance Schema 把数据库内部变成一张可查的表
数据库·mysql
这个DBA有点耶8 小时前
同城双活落地的三座山:网络延迟、脑裂预防、反向同步
数据库·架构·dba
青春之我_XP8 小时前
MySQL 常用日期函数 实战指南
数据库·sql·mysql·数据分析·数据库开发·日期函数
Nturmoils8 小时前
sys_dump 备了库,角色和权限别漏在外面
数据库