在MySQL中删除'较旧'行的正确方法

时间:2013-08-07 07:22:13

标签: mysql sql

我的表格有一个TIME字段。

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

我可以在不使用SELECT的情况下删除旧行吗?

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

DELETE FROM tbl WHERE row_num > 5 ORDER BY TIME

如何使用SELECT在MySQL whitout中实现此功能以获取TIME值列表?

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

100000可能是一个非常大的没有

答案 3 :(得分:0)

也许这会是另类选择:

DELETE FROM tbl 
WHERE  primary_key NOT IN (SELECT primary_key 
                           FROM tbl 
                           ORDER BY time
                           DESC LIMIT 5)