$st = $dbh->prepare("UPDATE items SET some_id = ? WHERE id = ?");
foreach ($items as $key => $val)
$st->execute(array($key, $val));
是否有更有效的解决方案?
答案 0 :(得分:1)
嗯,这一切都与大小有关;)
如果您想要INSERT
数百万行,您应该:
CREATE TABLE items_copy LIKE items
或类似的。items_copy
items_copy
FROM CSV文件: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
。你应该这样做的原因是为每个查询连接到数据库将破坏有效性。
否则你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');