大量のデータを含むmysqlテーブルがあります。このテーブルのすべての行には、純粋なSQLでは簡単に表現できない方法で1つのフィールドを変更する必要があります。
テーブルを1行ずつループして、すべてのエントリを1つずつ更新できるようにしたいと思います。ただし、これを行うには、次のようなことを行います。
$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内の1回のヒットですべてのデータを取得するのではなく、カーソルを使用して最初に選択することを心配しています。その後、ループ内の更新によって引き起こされるカーソルの無効化について不明な点があります。「別のカーソルでスキャンしているときに同じテーブルを更新しない」などのルールがある場合、それは巨大なテーブルにのみ表示される可能性が高いため、小さなテストケースを実行してもほとんど役に立ちません。
この方法で作業する際の特定の問題ではなく、これを実行しても問題ないと言うドキュメントを誰かが私に指摘できれば、それも素晴らしいことです。