我的表格有一个TIME
字段。
我想只保留5个最新的行。
我可以在不使用SELECT
的情况下删除旧行吗?
我认为逻辑应该是这样的:
DELETE FROM tbl WHERE row_num > 5 ORDER BY TIME
如何使用SELECT
在MySQL whitout中实现此功能以获取TIME
值列表?
答案 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)