我有一个包含大量数据的mysql表。此表中的所有行都需要以一种在纯SQL中不易表达的方式修改一个字段。
我希望能够逐行循环遍历表,并逐个更新所有条目。 但要做到这一点,我会做类似的事情:
$sql = "SELECT id,value FROM objects";
foreach ($dbh->query($sql) as $row)
{
$value = update_value( $row['value'] );
$id = $row['id'];
$update_sql = "UPDATE objects SET value='$value' WHERE id=$d";
$dbh->query( $update_sql );
}
这会做坏事吗? (除了可能很慢?)
澄清:特别是我担心第一次选择使用游标,而不是在foreach中的一次命中中检索所有数据,然后 由于循环内部的更新导致游标失效,我不知道。如果有一些规则,例如“在用另一个光标扫描时不要更新同一个表”,它可能只会出现在巨大的表格上,所以我执行一个小的测试用例几乎没用。
如果有人可以指向我说这样做是正常的,而不是以这种方式工作的特殊问题,那也很棒。
答案 0 :(得分:0)
好像你有两个选择:
根据尺寸和持续时间的不同,您可能需要事先锁定所有内容。
答案 1 :(得分:0)
单个查询的结果是一致的,因此更新不会影响它。请记住:
使用准备好的陈述;它会减少进程和数据库之间的流量,因为每次只传输值而不是整个查询。
如果您担心同时运行其他进程,则应使用事务和正确锁定,例如
// transaction started
SELECT id,value
FROM objects
LOCK IN SHARE MODE
// your other code
// commit transaction