At 17:00 +0000 3/8/02, Corin Hartland-Swann wrote:
>Hi there,
>
>I have a medium-size table (3 million rows) with several pieces of data
>including an ID and a number (called id and num below). I have a program
>which builds a hash in perl from a data file of the 'new' numbers for each
>id, only some of which have changed (5-10%).
>
>To update the table I tried using the following code (paraphrased):
>
>--------------------------------------------------------------------------
>
>$sth = $dbh->prepare("SELECT id,num FROM table", { 'mysql_use_result' => 1 });
>
>$sth->execute;
>
>$sth->bind_columns(\$id, \$num);
>
>while ($sth->fetch)
>{
>     $new_num = $hash{$id};
>
>     $dbh->do("UPDATE table SET num = $new_num WHERE id = $id")
>         if $num != $new_num;
>}
>
>$sth->finish;
>
>--------------------------------------------------------------------------
>
>This works for a varying number of rows (usually 5,000 to 10,000) before
>it silently exits the loop. I'm using MySQL 3.23.49a
>
>I was wondering if there is a problem with doing this in MySQL. Because of
>the size of the table and my script's already gargantuan memory footprint
>(it tops out 600 MB by the time it gets to this stage) I need to avoid
>storing the entire result in DBI, hence mysql_use_result.

That's also your problem.  With mysql_use_result, it's *required*
that you completely finish the query before issuing another one.

I suppose you could write the IDs to a file, then read them back in
and use them to issue the UPDATE statements.

>
>As an alternative I could mark all the id's that have changed and then
>perform the updates after I have closed the table, but I expected this way
>of doing it to work fine. I have run it through numerous times, and it
>always drops out of the loop at the same sort of interval (but often
>differs from run to run).
>
>Should this be working or should I find another way? If it is a bug then I
>will of course try to produce more information, but I just want to check
>I'm doing the right thing first.
>
>Many Thanks,
>
>Corin
>
>/------------------------+-------------------------------------\
>| Corin Hartland-Swann   |    Tel: +44 (0) 20 7491 2000        |
>| Commerce Internet Ltd  |    Fax: +44 (0) 20 7491 2010        |
>| 22 Cavendish Buildings | Mobile: +44 (0) 79 5854 0027        |
>| Gilbert Street         |                                     |
>| Mayfair                |    Web: http://www.commerce.uk.net/ |
>| London W1K 5HJ         | E-Mail: [EMAIL PROTECTED]        |
>\------------------------+-------------------------------------/


---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to