我的表有一个TIME
字段。
我只想保留 5 个最新的行。
我可以不使用删除旧行SELECT
吗?
我认为逻辑应该是这样的:
DELETE FROM tbl WHERE row_num > 5 ORDER BY TIME
如何在 MySQL whitout 中使用SELECT
来获取TIME
值列表来实现这一点?
如果没有适当的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;
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
也许这将是另一种选择:
DELETE FROM tbl
WHERE primary_key NOT IN (SELECT primary_key
FROM tbl
ORDER BY time
DESC LIMIT 5)
如果要排除前 5 行,请使用以下内容:
DELETE FROM table WHERE primary_key IN
(SELECT primary_key FROM table LIMIT 1 OFFSET 5,1000000)
100000 可能是一个非常大的数字