Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 删除行,以便有最大行限制_Mysql - Fatal编程技术网

Mysql 删除行,以便有最大行限制

Mysql 删除行,以便有最大行限制,mysql,Mysql,下面是我试图做的,在一个查询中解释 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行。对于这个确切的作业,我立即想到的唯一方法是手动执行

首先,把桌子锁上。您不希望在执行此操作时更改行数。如果锁对你的应用程序不实用,你就必须设计一个更聪明的排队系统,而不是使用这种方法

接下来,获取当前行数:

SELECT count(*) FROM table
一旦你做到了,你应该用简单的数学计算出需要删除多少行。假设它是1005-您需要删除5行

DELETE FROM table ORDER BY dateRegistered ASC LIMIT 5
现在,打开桌子


如果锁对您的场景不实用,那么您必须更聪明一点——例如,选择需要删除的所有行的唯一ID,并将它们排队等待逐步删除。我让您自己来解决这个问题:

如果您有一个行的唯一ID,那么理论上这是正确的方法,但即使您在dateRegistered列上有一个索引,也不是非常有效:

我认为最好是直接按日期而不是按行数限制删除


我认为没有办法在CREATETABLE语句中设置它,至少不是一个可移植的语句。

是的,但这将删除1000行。。。如果你明白我的意思,就不要留下1000行。让我试着编辑一下问题,是的,你在ASC上是对的。。。我的大脑无法适应新理解的问题限制:我能把数学放在极限吗,塞纳里奥?例如,我可以做:限制选择。。。。。。或者我必须在另一个查询中执行它?哦,我喜欢这个。我倾向于避开子查询,因为它们通常效率很低,但乍一看似乎效率更高,特别是因为它不必为每一行重新运行。
DELETE FROM table
WHERE id NOT IN (
    SELECT id FROM table
    ORDER BY dateRegistered DESC
    LIMIT 1000
)