2

我的表有一个TIME字段。

我只想保留 5 个最新的行。

我可以不使用删除旧行SELECT吗?

我认为逻辑应该是这样的:

DELETE FROM tbl WHERE row_num > 5 ORDER BY TIME

如何在 MySQL whitout 中使用SELECT来获取TIME值列表来实现这一点?

4

4 回答 4

3

如果没有适当的ORDER BY子句,SQL 结果集必须被认为是无序的。

您必须提供一列来显式存储您的行序列号。这可能是时间戳或表的 auto_increment 列。

请记住,您也可以同时访问您的表。如果在您删除时其他人正在插入,那么预期的行为应该是什么?据我所知,这可能会导致您只保留“5 个最新行”+“那些插入其他事务的行”。


如果您time的桌子上有用于此目的的列和PRIMARY KEY(或其他UNIQUE NOT NULL列),您可以编写:

DELETE tbl FROM tbl LEFT JOIN (SELECT * FROM tbl ORDER BY tm DESC LIMIT 5) AS k
    ON (tbl.pk) = (k.pk)
    WHERE k.`time` IS NULL;

如果你有复合主键(a,b)你可以写:

DELETE tbl FROM tbl LEFT JOIN (SELECT * FROM tbl ORDER BY tm DESC LIMIT 5) AS k
    ON (tbl.a,tbl.b) = (k.a,k.b)
    WHERE k.tm IS NULL;
于 2013-08-07T07:37:31.557 回答
0
DELETE FROM TBL
  WHERE ROW_NUM = (SELECT ROW_NUM FROM TBL LIMIT 6, 99999)
  ORDER BY TIME DESC; 

这将从 6, 7, 8, 9, 10, ....., 200005 中删除记录

因为这里的LIMIT范围从 6 到 9999 条记录开始,表示 200005

于 2013-08-07T07:28:07.453 回答
0

也许这将是另一种选择:

DELETE FROM tbl 
WHERE  primary_key NOT IN (SELECT primary_key 
                           FROM tbl 
                           ORDER BY time
                           DESC LIMIT 5)
于 2013-08-07T09:50:43.227 回答
0

如果要排除前 5 行,请使用以下内容:

DELETE FROM table WHERE  primary_key IN 
(SELECT primary_key FROM table LIMIT 1 OFFSET 5,1000000)

100000 可能是一个非常大的数字

于 2013-08-07T07:30:35.637 回答