2013-09-21 21 views
10

Devo aggiornare molte colonne in molte righe in PostgreSQL 9.1. Attualmente sto facendo con molti diversi UPDATE query, ognuno che funziona su una riga diversa (in base alla chiave primaria):Aggiornamento di più righe con chiave primaria diversa in una query in 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; 

devo fare parecchie migliaia di queste query.

C'è qualche cosa che posso "aggiornamento di massa" un sacco di righe in una query a PostgreSQL? Se si utilizza INSERT, è possibile inserire più righe contemporaneamente: (INSERT INTO mytable (column_a, column_b) VALUES ((12, 6), (1, 45));), Esiste qualcosa del genere per UPDATE?

Qualcosa di simile:

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

??

I punti importanti è che ogni 'VALUE' aggiornerà solo una riga (basato sul WHERE id =). Ogni riga avrà lo stesso numero fisso di colonne che è necessario aggiornare, ma ogni riga avrà valori diversi per ogni colonna, quindi UPDATE mytable SET column_a = 12, column_b = 6 WHERE id IN (1, 2, 3); non funzionerà.

risposta

7

Se applicabile al caso, è possibile utilizzarlo.

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

Sì, è possibile (e di solito è preferito in SQL) per aggiornare più file in una sola volta. Ci sono alcuni modi per fare questo, ma la maggior parte leggibile ed elegante penso che è quello di utilizzare tabella derivata con ID e valori:

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 

Non così leggibili, ma la soluzione più ovvia sarebbe quella di utilizzare 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

Questo approccio ha funzionato benissimo per me !! Grazie!! Funziona anche con l'unione su più chiavi/colonne. Cioè, "dove c.id = m.id AND c.column_a = m.column_a"; –

Problemi correlati