我正在尝试将表上的所有行更新为基于 LIMIT 的 for 循环的迭代值,以便批量完成更新。我从帖子中的建议中得到了提示,在mysql中使用limit更新多行?,但它似乎给了我一个问题。该表包含超过 2400 行,相关字段具有 all-0 值。这是我的代码:
for($i = 0;$i < 7; $i++) {
$qq2_ = $db1->prepare("UPDATE ledum_orgs SET ledum_org_size = :val WHERE ledum_org_size IN (
SELECT ledum_org_size FROM (
SELECT ledum_org_size FROM ledum_orgs WHERE ledum_org_size = '0'
ORDER BY ledum_org_name ASC
LIMIT ".($i*400).", 400
) tmp
)"
);
$qq2_->bindValue(':val',$i);
$qq2_->execute();
echo $i."=>".$qq2_->rowCount().", ";
}
但它似乎忽略了 LIMIT 子句,将所有 2445 行的字段设置为"1"。下面是输出:
0=>0, 1=>2445, 2=>0, 3=>0, 4=>0, 5=>0,6=>0,
有人可以告诉我为什么会有这种行为吗?
在MySQL中,您不能在与in
一起使用的子查询中使用limit
。 您也不能引用在子查询中更新的表(不使用 join
)。 但是,您可以将其切换到join
:
UPDATE ledum_orgs lo JOIN
(SELECT ledum_org_size
FROM ledum_orgs
WHERE ledum_org_size = '0'
ORDER BY ledum_org_name ASC
LIMIT ".($i*400).", 400
) tmp
ON tmp.ledum_org_size = lo.ledum_org_size
SET lo.ledum_org_size = :val;
您可以将其简化为:
UPDATE ledum_orgs lo
SET lo.ledum_org_size = :val
WHERE ledum_org_size = '0'
ORDER BY ledum_org_name ASC
LIMIT ".($i*400).", 400