删除Mysql数据表中多余的重复记录的sql语句
2013-06-21 21:25
731 查看
数据表 sniper_tb 中存在主键 id,字段url,现需要在url字段上添加 unique,但由于url存在重复记录,导致添加失败。
如何删除表中多余的url重复记录,仅保持一条?
将 sniper_tb 表中 url 与 tmp.url 相同的记录找出来设置为集合 tmp2
tmp2.id 不在临时表 tmp.id 中的记录,则为最终需要删除的记录
以上思路的select sql语句如下:
将其中的 sniper_tb、id、url 替换成你本地对应的数据表及字段即可,将最开始的 select id 替换成 delete 即可删除这些多余的重复记录。
以上语句中的 where 1=1 是特意占位出来方便替换查询限制条件的:)
将这些重复记录中的最小 id 存为一个临时集合 tmp
将 sniper_tb 表中id > tmp.id 的重复记录删除
对应的 select sql 语句如下:
但在mysql中,直接将 select 替换成 delete语句会出现如下报错:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a where id > (select min(id) from sniper_tb b where a.url=b.url)' at line 1
mysql的delete写法有挺多限制,比较好的办法就是先 create 一个临时表,用完之后再drop掉,以上语句的 delete 实现为:
如何删除表中多余的url重复记录,仅保持一条?
思路一
将 sniper_tb 表按url字段分组,将其中 count(url) > 1 的记录存入一个临时表 tmp中,此临时表同时包含id字段将 sniper_tb 表中 url 与 tmp.url 相同的记录找出来设置为集合 tmp2
tmp2.id 不在临时表 tmp.id 中的记录,则为最终需要删除的记录
以上思路的select sql语句如下:
select id from sniper_tb where url in (select tmp.url from ( select url,id from sniper_tb where 1=1 group by url having count(url) > 1) tmp) and id not in (select tmp.id from ( select url,id from sniper_tb where 1=1 group by url having count(url) > 1) tmp)
将其中的 sniper_tb、id、url 替换成你本地对应的数据表及字段即可,将最开始的 select id 替换成 delete 即可删除这些多余的重复记录。
以上语句中的 where 1=1 是特意占位出来方便替换查询限制条件的:)
思路二
将 sniper_tb 表中的记录两两比较,找出 a.url = b.url 的重复记录将这些重复记录中的最小 id 存为一个临时集合 tmp
将 sniper_tb 表中id > tmp.id 的重复记录删除
对应的 select sql 语句如下:
select * from sniper_tb a where id > (select min(id) from sniper_tb b where a.url=b.url)
但在mysql中,直接将 select 替换成 delete语句会出现如下报错:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a where id > (select min(id) from sniper_tb b where a.url=b.url)' at line 1
mysql的delete写法有挺多限制,比较好的办法就是先 create 一个临时表,用完之后再drop掉,以上语句的 delete 实现为:
create table tmp as select id from sniper_tb a where id > (select min(id) from sniper_tb b where a.url=b.url); delete from sniper_tb where id in(select id from tmp); drop table tmp;
参考资料
MySql报错: You can't specify target table 'table name' for update in FROM clause相关文章推荐
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- 关于mysql中删除重复记录,并保留重复数据中的一条数据的SQL语句理解
- mysql删除重复记录的SQL语句
- mysql中删除完全重复数据的准确SQL语句
- 使用SQL语句对重复记录查询、统计重复次数、删除重复数据
- 常用sql语句之删除或查询单个字段重复数据的记录
- 删除不同粒度的事实表记录中重复的度量值数据的SQL语句
- mysql删除重复记录语句的方法 作者: 字体:[增加 减小] 类型:转载 时间:2010-06-21 我要评论 查询及删除重复记录的SQL语句,虽然有点乱,但内容还是不错的。 . .
- 删除oracle 表中重复数据sql语句、保留rowid最小的一条记录
- SQL语句 删除表user 中字段name 内容重复的记录,A表 ,B表 字段相同 有关联关系的表 对表两个表中的数据
- 使用SQL语句对重复记录查询、统计重复次数、删除重复数据
- mysql 删除重复数据的sql语句
- MySQL语句删除数据库重复记录数据行
- MYSQL用一条SQL语句删除重复记录
- 删除多余数据,只保留前10条记录的SQL语句
- MYSQL用一条SQL语句删除重复记录
- Oracle 查询并删除重复记录的SQL语句
- 用SQL语句删除重复记录的2种方法.txt
- SQL 删除重复记录,同时统计重复记录某一列的数据 以及 SET XACT_ABORT