对于表中的每个user_id(组),我想删除除每组中ID最高的记录之外的所有记录。类似于此的内容:Delete all records except the most recent one?
就我而言,它看起来像:
DELETE FROM logins
WHERE user_id IS NOT NULL AND id NOT IN (SELECT MAX(id) FROM logins WHERE user_id IS NOT NULL GROUP BY user_id)
问题是,该表保存了100多个记录,因此在单个查询中执行此操作是不可能的性能。
我可以采取哪些其他方式,例如:在一些批次?
答案 0 :(得分:0)
我倾向于将delete
标记为:
DELETE FROM logins l
WHERE l.user_id IS NOT NULL AND
l.id <> (SELECT MAX(l2.id)
FROM logins l2
WHERE l2.user_id = l.user_id
);
这可以轻松利用logics(user_id, id)
上的索引。但是,如果要删除大量行,通常最好截断表并重新创建:
create table temp_logics as
select l.*
from logins
where l.id = (SELECT MAX(l2.id)
FROM logins l2
WHERE l2.user_id = l.user_id
);
truncate table logins;
insert into logins
select * from temp_logins;
如果采用这种方法,请务必在截断第二个表之前验证temp_logins
。实际上,您不希望为中间表使用临时表,因为数据库可能会发生某些事情 - 您将丢失数据。