我需要在保留一个项目的同时从表中删除重复项。由于我在where语句中的子查询中访问同一个表时无法从表中删除,因此我决定将受影响的ID存储在临时表中:
create temporary my_temp_table (
id int not null
) engine memory;
然后使用select:
插入IDinsert into my_temp_table
-- select query works
select
id
from
-- innodb
table_with_duplicates
where
hash_code in (
select
hash_code
from
table_with_duplicates
group by
hash_code
having
count(id) > 1
)
and date_created < '2015-01-01'
;
稍后我想使用这些ID删除它们:
delete from table_with_duplicates
where id in (
select id from my_temp_table
)
;
只是执行insert语句的select部分工作正常。但是,添加插入部分会导致1个CPU核心达到100%并且查询似乎永远不会结束。什么都没插入。 在我的开发环境中, table_with_duplicates 包含大约20000行,其中1个重复。 有什么想法吗?
修改 谢谢您的回答。我尝试了一种选择不同的(...... )方法,它没有多大帮助。也许我已经在错误的地方使用了/ subselect。已经玩了很多为了澄清,我有这样的事情:
ID date_created hash_code
1 2013-06-06 ABCDEFGH <-- delete this one
2 2013-08-08 HGFEDCBA
3 2015-11-11 ABCDEFGH <-- keep this one
答案 0 :(得分:0)
好吧,我选择了不同的方法来解决这个问题。我编写了一个小的PHP命令行脚本,它将我的所有ID读取到一个数组中,然后使用所有ID作为....执行DELETE。
"delete from table_with_duplicates where id in (".explode(',' $arrIDs).")";
有大约9000个受影响的行,并且(希望)是一次性行动,这对我有用。
我也玩过
SET SESSION optimizer_search_depth = 1;
但也没有运气。