$st = $dbh->prepare("UPDATE items SET some_id = ? WHERE id = ?");
foreach ($items as $key => $val)
$st->execute(array($key, $val));
有更有效的解决方案吗?
大小是关键;)
如果您想要INSERT
数百万行,您应该:
- 从php生成CSV文件,放在数据库中可用的位置。
-
CREATE TABLE items_copy LIKE items
或类似 - 删除
items_copy
中所有的key - 从CSV文件插入
items_copy
: http://dev.mysql.com/doc/refman/5.0/en/loading-tables.html -
UPDATE SET
与SELECT * FROM items_copy
的组合 -
DROP TABLE items_copy
如果你只想插入几千行,你应该将你的查询合并成一个大字符串,并在事务中执行,如:
$q = 'START TRANSACTION;';
$q .= 'UPDATE items SET some_id = ? WHERE id = ?;';
$q.= 'UPDATE items SET some_id = ? WHERE id = ?;';
....
$q .= 'COMMIT;';
然后执行$q
。您应该这样做的原因是,每次查询都连接到数据库将破坏效率。
嗯,也许吧,
$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');