[英]Update multiple MySQL rows based on position in array
我有一个数组(在PHP中),该数组具有UID列表,并且我想更新一个MySQL表,该表已经包含具有这些UID的行,并具有UID在数组中的位置的索引。
因此,我的UID数组可能是:
[1123,4542,3456,2212,2346,7778,577885,44322]
然后,我想将表更新为以下效果:
POS | UID
----------
1 |1123
2 |4542
3 |3456
etc
----------
数据集(数组)可能非常大(超过1000个),并且我要更新的表还包含其他UID,这些UID是我不想触摸的其他数据集的一部分(但将具有唯一的UID)。
我显然可以通过循环和减少更新语句来做到这一点,但是想知道是否有更有效的方法来执行单个或几个语句。
我已经做了很多搜索,只能找到与设置/固定数量的值或基于其他数据库表进行更新有关的答案,但是我的数组的长度会根据要更新的数据集而有所不同。
如果使用预准备语句进行更新的速度不够快,则可以尝试使用批量插入将数据“预加载”到临时表中。 这是PDO的示例代码:
// $uids = [1123,4542,3456,2212,2346,7778,577885,44322,...]
$values = [];
foreach ($uids as $key => $uid) {
$pos = $key+1;
$values[] = "($uid,$pos)";
}
$values = implode(',', $values);
$pdo->exec("
drop temporary table if exists tmpdata;
create temporary table tmpdata (uid int, pos smallint) engine=memory;
insert into tmpdata(uid, pos) values $values;
update test d
join tmpdata t using(uid)
set d.pos = t.pos;
");
我已经用10K UID数组进行了测试-它在我的机器上运行时间为50ms。
注意:您可能需要验证/清除数据以防止SQL注入。
如果您使用复制,也请阅读此内容 。
道歉,忘了更新问题-我已经选择了简单的选项,即循环遍历对象并使用新查询更新每个对象。
我没有任何具体的时间安排,但是通过这种方式似乎没有任何明显的性能损害,因此我对该方法感到非常满意
谢谢大家的帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.