繁体   English   中英

根据数组中的位置更新多个MySQL行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM