MySQL: Update Multiple Rows or Records with One Single Query

by Yang Yang on May 17, 2009

in SQL / MySQL Tips and Tutorials

As MySQL doesn’t have inherent support for updating more than one rows or records with a single update query as it does for insert query, in a situation which needs us to perform updating to tens of thousands or even millions of records, one update query for each row seems to be too much.

Reducing the number of SQL database queries is the top tip for optimizing SQL applications.

So, is there any other way around with just a few MySQL queries that  equals to millions of single row update queries?

Yes, but you need a temporary table.

Step 1: Create a temporary table

This table should have 2 columns: 1) an ID column that references the original record’s primary key in the original table, 2) the column containing the new value to be updated with.

Creating this table, you can use insert queries as it conveniently inserts more than one rows at a time (with a single query) – actually, as many rows as you need, like 1000 a time.

Step 2: Transfer the new values from the temporary table to the intended table

Use the query below:

UPDATE original_table, temp_table SET original_table.update_column = temp_table.update_column WHERE original_table.id = temp_table.original_id

To transfer all the new values you have in the temporary table to the original table. After this, you have successfully updated the original table with much much less than a million queries, probably just a hundred or so.

UPDATE =============================================

So here’s perhaps a better idea in most of the cases, use the CASE WHEN ELSE END syntax of MySQL to update multiple rows in the options table of your web application:

UPDATE `options` SET `value` = CASE `name`
WHEN 'site_name' THEN 'My Blog'
WHEN 'site_url' THEN 'http://www.example.com'
WHEN 'site_email' THEN 'sam@example.com'
ELSE `value`
END

Make sure you include the ELSE `value` because if you don’t, the other rows not mentioned here will be updated to have empty values.

Related Posts

{ 8 comments… read them below or add one }

curiousity is wasting my time November 11, 2009 at 2:21 pm

If all the record that want to be updated is the same, just

UPDATE myTable SET type=”A”, model=”B” WHERE id IN ( 1, 2, 3)

Reply

Yang Yang February 26, 2010 at 5:53 pm

Nice!

Reply

charles caadlawon February 16, 2010 at 1:38 pm

hello i want to ask if how can i able to update one single row in different tables. i use php and mysql as my repository

Reply

Marty Jongepier March 27, 2010 at 6:18 am

Excellent! Took me long to find this, have been pulling my hair out for days until I found this! Thank you!

Reply

AgDude April 16, 2010 at 9:29 pm

Excellent Tip! It seems really simple now that I see it, but I have been using a lot of slow loops for a long time. Thanks.

Reply

cheers!!!!! May 17, 2010 at 4:43 pm

we have been fighting the slow sql update problem for days now,

your solution was quick to implement and works like a charm.

thanks!!!!

Reply

Colin Bodkin May 24, 2010 at 11:11 pm

I am using MySQL 5.0. Do the databases need to be of a certain type (MyISAM, InnoDB) for this to work?

Reply

Yang Yang May 25, 2010 at 12:07 pm

I think either type is fine with this approach.

Reply

Leave a Comment

Previous post:

Next post: