以下是我想做的内容,以查询的方式解释:
DELETE FROM table ORDER BY dateRegistered DESC LIMIT 1000 *
我希望在我已经设计好的脚本中运行这样的查询。每次它找到1001条或更多旧记录时,就会删除它们。
所以相当于设置最大行大小,但是删除所有旧记录。
实际上,在CREATE语句中是否有设置的方法。
因此:如果我在数据库中有9023行,运行该查询时,它应该删除8023行,只留下1000行。
以下是我想做的内容,以查询的方式解释:
DELETE FROM table ORDER BY dateRegistered DESC LIMIT 1000 *
我希望在我已经设计好的脚本中运行这样的查询。每次它找到1001条或更多旧记录时,就会删除它们。
所以相当于设置最大行大小,但是删除所有旧记录。
实际上,在CREATE语句中是否有设置的方法。
因此:如果我在数据库中有9023行,运行该查询时,它应该删除8023行,只留下1000行。
如果您在这里有行的唯一ID,那么这是理论上正确的方法,但效率并不高(即使dateRegistered
列有索引):
DELETE FROM table
WHERE id NOT IN (
SELECT id FROM table
ORDER BY dateRegistered DESC
LIMIT 1000
)
我认为,直接通过日期限制DELETE
比通过行数限制更好。
我不认为在CREATE TABLE
语句中设置这个是可移植的。
对于这个特定的任务,我能立即想到的唯一方法是手动完成。
首先,锁定表格。在进行此操作时,您不希望行数发生变化。(如果锁定不适用于您的应用程序,则必须制定更精巧的排队系统,而不是使用此方法。)
接下来,获取当前行数:
SELECT count(*) FROM table
一旦你有了这个,你应该通过简单的数学计算能够确定需要删除多少行。比如说它显示1005 - 你需要删除5行。
DELETE FROM table ORDER BY dateRegistered ASC LIMIT 5
现在,解锁该表。
如果锁定对于您的情况不实用,您需要更加聪明 - 例如,选择所有需要删除的行的唯一ID,并将它们排队逐步删除。我会让您自己解决这个问题 :)