【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
);
相关推荐
dl8106727311 小时前
Redis的IO多路复用
数据库·redis·缓存
小王子玫瑰狐2 小时前
数据库之MySQL
数据库·mysql
Arbori_262155 小时前
oracle DECODE 函数
数据库·oracle
songx_995 小时前
数据库10(代码相关语句)
数据库·sql
沸材6 小时前
MySQL——事务
数据库·mysql·事务
雯0609~6 小时前
thinkphp:部署完整项目到本地phpstudy
数据库·oracle
caihuayuan47 小时前
Redis奇幻之旅(三)1.redis客户端与服务端
java·大数据·sql·spring·课程设计
文牧之8 小时前
MySQL 修改用户密码
运维·数据库·mysql
sxlzs_9 小时前
oracle怎么查看是否走了索引
数据库·oracle
余大冠子9 小时前
oracle判断同表同条件查出两条数据,根据长短判断差异
数据库·oracle