我使用以下查询删除多个记录,除了我的表中的一个记录。它适用于小型表格,但是当我使用具有> 130000条记录的表格进行尝试时它会卡住。问题是,我甚至没有得到错误。 phpMyAdmin只是卡住了,查询(“loading ...黄线”)基本上是永远的。
我的表结构
person_id (AI & PK)
person_name ( I want to delete multiple person_name records except one)
查询
DELETE t2
FROM `person` t1
INNER JOIN `person` t2
ON t1.person_name = t2.person_name
AND t1.person_id < t2.person_id;
更新:我在人员表上没有索引。但我的其他三个表(person_job&amp; person_image,book_who_wrote_it)包含来自人员表的外键(person_id)
答案 0 :(得分:4)
首先,你有person(person_name, person_id)
的索引吗?那将是开始的地方。
删除大量行会产生开销。通常,将结果放在另一个表中并重新插入它会更快:
create temporary table tmp_person as
select p.*
from person p join
(select person_name, max(person_id) as max_person_id
from person
) pp
on p.person_id = pp.max_person_id;
truncate table person;
insert into person
select * from tmp_person;
确保在截断tmp_person
之前验证person
!截断不记录每行的删除,因此在大多数情况下它比delete
快得多。
注:
如果person
中只有两列,那么您可以将第一个查询简化为:
create temporary table tmp_person as
select person_name, max(person_id) as max_person_id
from person;
答案 1 :(得分:0)
试试这个
DELETE
FROM `person` t1
where person_id not in
(select * from
(select person_id from person group by person_name)x)