有一次由于不太熟悉业务,忘了加唯一索引,导致数据库里不少重复数据。为了删除重复数据,编写下面的SQL语句,但是执行完后却报了如标题的错误。原因是:MySQL不允许在进行子查询的同时删除原表数据。
- DELETE FROM table1
- where order_id in
- (select order_id from table1 group by order_id having count(order_id) > 1)
- and id not in
- (select min(id) from table1 group by order_id having count(order_id)>1);
其中的一个解决办法如下,就是在将查询结果作为一个结果集,再从这个结果集中取数据,然后保留最小id的数据。SQL如下(第2,3,4,9,10为新添加的)。
- delete from table1
- where id in (
- select id from (
- select id from table1
- where order_id in
- (select order_id from table1 group by order_id having count(*) > 1)
- and id not in
- (select min(id) from table1 group by order_id having count(*)>1)
- ) as t
- );
上面的sql给DBA看到后,立马就给喷了,说这样执行太低,于是修改成下面这样:
- delete a from table1 a ,
- (select min(id) as ms ,order_id from table1 group by order_id having count(*)>1) b
- where a.order_id=b.order_id and a.id>b.ms