MySQL - 高效删除除最后N条以外的所有记录
MySQL - Efficiently delete all records except last N
我最近开始学习 SQL,现在被要求对 table 执行简单的删除,为每个用户保留最后 100 条记录。我正在研究最好的方法(更有效的方法)来归档这个,并找到了一些可能的解决方案(SQL query: Delete all records from the table except latest N? , Delete all but top n from database table in SQL),但根据效率选择一个对我来说有点复杂。所以我在这里请求你的帮助。
这是我们保存用户访问日志的 table 称为 "access" 的地方。
access:
- id (autoincrement) - primary
- userid (integer 11) - key
- refer (varchar 100)
- date (date/time)
我的想法是在每次同一用户进入系统时从用户标识中删除旧记录,就在插入新日志之前。
我试过下面这段代码但出现错误:此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME subquery'
DELETE FROM
access
WHERE
id NOT IN (
SELECT id FROM access WHERE userid = 10 ORDER BY id DESC LIMIT 100
);
拜托,你能给我一些解决方案吗?谢谢!
我不是 Mysql
方面的专家,不知道为什么 Mysql
不允许这样做。尝试这样的事情
DELETE a
FROM access a
INNER JOIN (SELECT id
FROM access
WHERE userid = 10
ORDER BY id DESC
LIMIT 100) b
ON a.id <> b.id
注意:这可能不像评论中提到的那样有效
尝试删除连接:
delete a from access a left join (
select id
from access
order by id desc limit 1000
) b on a.id = b.id
where b.id is null;
如果您想保留给定用户(例如 123)的前 1000 条记录不被删除:
delete a from access a left join (
select id
from access
where userid = 123
order by id desc limit 1000
) b on a.id = b.id
where b.id is null;
如果您只想删除用户 123 的行,但该用户的前 1000 行除外:
delete a from access a left join (
select id
from access
where userid = 123
order by id desc limit 1000
) b on a.id = b.id
where b.id is null
and a.userid = 123;
我最近开始学习 SQL,现在被要求对 table 执行简单的删除,为每个用户保留最后 100 条记录。我正在研究最好的方法(更有效的方法)来归档这个,并找到了一些可能的解决方案(SQL query: Delete all records from the table except latest N? , Delete all but top n from database table in SQL),但根据效率选择一个对我来说有点复杂。所以我在这里请求你的帮助。
这是我们保存用户访问日志的 table 称为 "access" 的地方。
access:
- id (autoincrement) - primary
- userid (integer 11) - key
- refer (varchar 100)
- date (date/time)
我的想法是在每次同一用户进入系统时从用户标识中删除旧记录,就在插入新日志之前。
我试过下面这段代码但出现错误:此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME subquery'
DELETE FROM
access
WHERE
id NOT IN (
SELECT id FROM access WHERE userid = 10 ORDER BY id DESC LIMIT 100
);
拜托,你能给我一些解决方案吗?谢谢!
我不是 Mysql
方面的专家,不知道为什么 Mysql
不允许这样做。尝试这样的事情
DELETE a
FROM access a
INNER JOIN (SELECT id
FROM access
WHERE userid = 10
ORDER BY id DESC
LIMIT 100) b
ON a.id <> b.id
注意:这可能不像评论中提到的那样有效
尝试删除连接:
delete a from access a left join (
select id
from access
order by id desc limit 1000
) b on a.id = b.id
where b.id is null;
如果您想保留给定用户(例如 123)的前 1000 条记录不被删除:
delete a from access a left join (
select id
from access
where userid = 123
order by id desc limit 1000
) b on a.id = b.id
where b.id is null;
如果您只想删除用户 123 的行,但该用户的前 1000 行除外:
delete a from access a left join (
select id
from access
where userid = 123
order by id desc limit 1000
) b on a.id = b.id
where b.id is null
and a.userid = 123;