博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于MYSQL通过子查询删除重复数据的for update报错问题解决
阅读量:6871 次
发布时间:2019-06-26

本文共 841 字,大约阅读时间需要 2 分钟。

今天遇到一个问题。如何删除一种数据表中某个字段的重复数据记录?

例如有表info,该表的title字段有很多重复数据,现在我们需要删除掉重复数据,只保留最早的一条。

利用Oracle是比较简单的,直接用ROWID即可解决:

DELETE FROM info WHERE ROWID NOT EXIST(SELECT MIN(ROWID) rid FROM info GROUP BY title) ;

但是用mysql删除的时候,却遇到了问题:

DELETE FROM info WHERE id NOT EXIST(SELECT MIN(id) id FROM info GROUP BY title) ;

此时,数据库报错:You can't specify target table 'info' for update in FROM clause;

通过for update我们不难猜出应该是由于mysql的悲观锁机制造成的,mysql不允许在进行select的同时对同一张表执行update操作。

此时有两种方式进行解决,一种是通过中间表:

根据子查询创建中间表:CREATE TABLE temp AS (SELECT MIN(id) id FROM info GROUP BY title) ;根据中间表中的结果数据删除目标数据表中的数据:DELETE FROM info WHERE id NOT EXIST(SELECT id FROM temp) ;删除中间表:DROP TABLE temp ;

第二种方式是通过对子查询数据表创建别名的方式进行:

DELETE FROM info WHERE id NOT EXIST(SELECT id FROM (SELECT MIN(id) id FROM info GROUP BY title) temp) ;

 

转载于:https://www.cnblogs.com/gaorongyi/p/5003516.html

你可能感兴趣的文章
Python Python 正则 取中括号值
查看>>
uva 658(Dijkstra)
查看>>
uva 11183(最小树形图)
查看>>
sql 集合查询 数据更新操作语句
查看>>
静态内部类
查看>>
localStorage使用总结
查看>>
计算一年中的第几天
查看>>
iOS 一句话获取日期和星期几
查看>>
【javascript】Lazy Load, 延迟加载图片的 jQuery 插件
查看>>
Percona XtraDB Cluster高可用与状态快照传输(PXC 5.7 )
查看>>
OBJECT_ID 技巧整理
查看>>
Date日期类,Canlendar日历类,Math类,Random随机数学类
查看>>
java中forName()的作用
查看>>
解决oracle_4031错误的方法
查看>>
C# Out,Ref 学习总结
查看>>
CentOS 7.4如何安装Python3
查看>>
instanceof
查看>>
activity的四种模式
查看>>
z-index
查看>>
git 和github
查看>>