2013-09-21 31 views
10

我必須更新PostgreSQL 9.1中很多行的許多列。我目前正在做許多不同UPDATE查詢,每一個在不同的行工作(基於主鍵):在PostgreSQL的一個查詢中用不同的主鍵更新多行?

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; 

我要做幾千這些查詢。

有無論如何我可以「批量更新」在PostgreSQL中的一個查詢中的很多行?如果您使用INSERT,則可以一次插入多行:(INSERT INTO mytable (column_a, column_b) VALUES ((12, 6), (1, 45));),是否有類似於UPDATE的內容?

喜歡的東西:

UPDATE mytable SET (id, column_a, column_b) FROM VALUES ((1, 12, 6), (2, 1, 45), (3, 56, 3), …) 

重要的一點是,每個'VALUE'只會更新一行(基於WHERE id =)。每行將有相同的固定數量的需要更新的列,但每行的每列都有不同的值,因此UPDATE mytable SET column_a = 12, column_b = 6 WHERE id IN (1, 2, 3);將不起作用。

回答

7

如果這適用於您的情況,您可以使用它。

create table test(id int, a int, b int); 

insert into test(id, a, b) 
values 
(1, 1, 1), 
(2, 1, 1), 
(3, 1, 1), 
(4, 1, 1), 
(5, 1, 1), 
(6, 1, 1), 
(7, 1, 1); 


update test as d 
set a = s.a, b = s.b 
from 
(
    values 
    (1, 2, 2), 
    (2, 2, 2) 
) as s(id, a, b) 
where d.id = s.id 

SQL FIDDLE DEMO

16

是的,你可以(而且通常它是在SQL首選)來同時更新多個行。這裏是幾個方法可以做到這一點,但最可讀的和優雅的,我認爲是使用派生表的id和值:

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 

並非如此可讀,但更明顯的解決方案是使用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) 
+0

這種方法對我來說非常好!謝謝!!也適用於連接多個鍵/列。即,「where c.id = m.id AND c.column_a = m.column_a」; –

相關問題