我需要更新一个表,除了它的前 1000 条记录。我的查询是这样的:
UPDATE tableA
SET price = 100
WHERE price = 200 AND
item_id =12 AND
status NOT IN (1,2,3);
我知道子查询方法在这里可以工作,但我有一个巨大的表,其中有 200000 条记录满足 WHERE
条件,而且它还在增长。所以我认为如果我遵循子查询方法,它不会随着数据库的增长而扩展。
我还看到在 UPDATE
查询中指定了 LIMIT
但它达到了某个限制。在我的例子中,它是在一定的偏移量之后,应该更新所有记录。
也可以找到总计数并用 LIMIT 指定它。但是 COUNT()
查询失败了。
最佳答案
您可以使用用户定义的变量:
SET @X = (SELECT ID FROM tableA
WHERE price = 200 AND item_id =12 AND status NOT IN (1,2,3)
ORDER BY ID LIMIT 1000,1 );
UPDATE tableA SET price = 100
WHERE price = 200 AND item_id =12 AND status NOT IN (1,2,3)
AND ID>@X;
是的,您将需要一些方法来定义“前 N 行是什么”。用户定义的变量为您提供了更多选择。如果您不能在某些选择查询中有效地做到这一点,您将需要考虑一些如何重新处理此类表的方法。也许不同的索引方法、拆分表、缓存一些值等。
关于N行后的MySQL更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26840188/