使用预准备语句更新许多行

时间:2014-08-14 19:52:19

标签: php mysql pdo

$st = $dbh->prepare("UPDATE items SET some_id = ? WHERE id = ?");

foreach ($items as $key => $val)
    $st->execute(array($key, $val));        

是否有更有效的解决方案?

2 个答案:

答案 0 :(得分:1)

嗯,这一切都与大小有关;)

如果您想要INSERT 数百万行,您应该:

  1. 从php生成CSV,将其放在数据库中可用的位置。
  2. CREATE TABLE items_copy LIKE items或类似的。
  3. items_copy
  4. 中删除所有密钥
  5. 插入items_copy FROM CSV文件:http://dev.mysql.com/doc/refman/5.0/en/loading-tables.html
  6. UPDATE SETSELECT * FROM items_copy
  7. 相结合
  8. DROP TABLE items_copy
  9. 如果您只想插入成千上万行,您应该将查询合并为一个大字符串并在事务中执行,例如:

    $q = 'START TRANSACTION;'; $q .= 'UPDATE items SET some_id = ? WHERE id = ?;'; $q.= 'UPDATE items SET some_id = ? WHERE id = ?;'; .... $q .= 'COMMIT;';

    然后执行$q。你应该这样做的原因是为每个查询连接到数据库将破坏有效性。

    否则你foreach的功能会很好。

答案 1 :(得分:0)

嗯,也许,

$dbh->beginTransaction();

$dbh->exec('LOCK TABLES items');

$st = $dbh->prepare("UPDATE items SET some_id = ? WHERE id = ?");

foreach ($items as $key => $val)
    $st->execute(array($key, $val)); 

$dbh->commit();
$dbh->exec('UNLOCK TABLES');