I have to update many columns in many rows in PostgreSQL 9.1. I'm currently doing it with many different UPDATE
queries, each one that works on a different row (based on the primary key):
UPDATE mytable SET column_a = 12, column_b = 6 WHERE id = 1;
UPDATE mytable SET column_a = 1, column_b = 45 WHERE id = 2;
UPDATE mytable SET column_a = 56, column_b = 3 WHERE id = 3;
I have to do several thousands of these queries.
Is there anyway I can "bulk update" lots of rows in one query in PostgreSQL? If you're using INSERT
, you can insert multiple rows at once: (INSERT INTO mytable (column_a, column_b) VALUES ( (12, 6), (1, 45) );
), Is there something like that for UPDATE
?
Something like:
UPDATE mytable SET (id, column_a, column_b) FROM VALUES ( (1, 12, 6), (2, 1, 45), (3, 56, 3), … )
??
The important points is that each 'VALUE' will only update one row (based on the WHERE id =
). Each row will have the same, fixed number of columns that need updating, but each row will have different values for each column, so UPDATE mytable SET column_a = 12, column_b = 6 WHERE id IN (1, 2, 3);
won't work.
It is very easy to update multiple columns in PostgreSQL. Here is the syntax to update multiple columns in PostgreSQL. UPDATE table_name SET column1 = value1, column2 = value2, ... [WHERE condition];
Column values on multiple rows can be updated in a single UPDATE statement if the condition specified in WHERE clause matches multiple rows. In this case, the SET clause will be applied to all the matched rows.
To update multiple columns use the SET clause to specify additional columns. Just like with the single columns you specify a column and its new value, then another set of column and values. In this case each column is separated with a column.
Yes, you can (and usually it's preferred in SQL) to update several rows at once. There're a few ways to do this, but most readable and elegant I think is to use derived table with id's and values:
update mytable as m set
column_a = c.column_a,
column_b = c.column_b
from (values
(1, 12, 6),
(2, 1, 45),
(3, 56, 3)
) as c(id, column_a, column_b)
where c.id = m.id
Not so readable, but more obvious solution would be to use case
:
update mytable set
column_a = case id when 1 then 12 when 2 then 1 when 3 then 56 end,
column_b = case id when 1 then 6 when 2 then 45 when 3 then 3 end
where id in (1, 2, 3)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With