批量更新ID列表中的值列表

时间:2012-12-05 00:13:30

标签: php mysql bulkinsert

我经常面临这个问题,作为Oracle用户,使用MySql。

出现以下情况:

  • ID列表(1,2,3,...,n)
  • 值列表('val1','val2','val3',...,'valn')[值显然与这些值完全不同]
  • 以前的2个列表是按顺序传递的。这意味着首先传递的值对应于首先传递的id。

目标是更新具有相应value的表value的所有id:val1应更新id 1,val2应更新id 2等...仅在一个查询。

简单的解决方案是更新n次:

UPDATE `value` SET `value`='val1' WHERE id = 1;
UPDATE `value` SET `value`='val2' WHERE id = 2;
UPDATE `value` SET `value`='val3' WHERE id = 3;
...
UPDATE `value` SET `value`='valn' WHERE id = n;

但我很乐意批量更新这一切。

sqlfiddle玩一下:http://sqlfiddle.com/#!2/d02e8

1 个答案:

答案 0 :(得分:2)

以下是使用一个查询执行此操作的一种方法。它不是最漂亮格式的查询,但它只是一个。

<?php

$id_list = implode(',', $ids);
$whens = implode(
    "\n    ",
    array_map(
        function ($id, $value) {
            return "WHEN {$id} THEN {$value}";
        },
        $ids,
        $values
    )
);

$sql = "
    UPDATE value
    SET value = CASE id
    {$whens}
    END
    WHERE id IN ({$id_list})
";
?>

请参阅我修改后的SQLFiddle