删除行以达到最大行限制

4

以下是我想做的内容,以查询的方式解释:

DELETE FROM table ORDER BY dateRegistered DESC LIMIT 1000 *

我希望在我已经设计好的脚本中运行这样的查询。每次它找到1001条或更多旧记录时,就会删除它们。

所以相当于设置最大行大小,但是删除所有旧记录。

实际上,在CREATE语句中是否有设置的方法。

因此:如果我在数据库中有9023行,运行该查询时,它应该删除8023行,只留下1000行。

2个回答

4

如果您在这里有行的唯一ID,那么这是理论上正确的方法,但效率并不高(即使dateRegistered列有索引):

DELETE FROM table
WHERE id NOT IN (
    SELECT id FROM table
    ORDER BY dateRegistered DESC
    LIMIT 1000
)

我认为,直接通过日期限制DELETE比通过行数限制更好。

我不认为在CREATE TABLE语句中设置这个是可移植的。


哦,我喜欢这个。我通常会避免使用子查询,因为它们通常效率低下,但乍一看,这似乎更有效率,特别是因为它不必为每一行重新运行。 - Matchu

3

对于这个特定的任务,我能立即想到的唯一方法是手动完成。

首先,锁定表格。在进行此操作时,您不希望行数发生变化。(如果锁定不适用于您的应用程序,则必须制定更精巧的排队系统,而不是使用此方法。)

接下来,获取当前行数:

SELECT count(*) FROM table

一旦你有了这个,你应该通过简单的数学计算能够确定需要删除多少行。比如说它显示1005 - 你需要删除5行。

DELETE FROM table ORDER BY dateRegistered ASC LIMIT 5

现在,解锁该表。


如果锁定对于您的情况不实用,您需要更加聪明 - 例如,选择所有需要删除的行的唯一ID,并将它们排队逐步删除。我会让您自己解决这个问题 :)


是的,但那会删除1000行……而不是留下1000行,如果你知道我的意思。让我试着稍微编辑一下这些问题。 - Angel.King.47
没错,你说的 ASC 是对的...我的大脑正在失去功能。 - Angel.King.47
已更新以适应新的问题限制 :) - Matchu
我能在极限场景中使用数学吗?例如,我可以这样做:LIMIT(SELECT .....)。还是我必须在不同的查询中执行它? - Angel.King.47

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接