2013-09-21 65 views
10

Tôi phải cập nhật nhiều cột trong nhiều hàng trong PostgreSQL 9.1. Tôi hiện đang làm việc đó với nhiều UPDATE truy vấn khác nhau, mỗi người làm việc trên một hàng khác nhau (dựa trên khóa chính):Cập nhật nhiều hàng với khóa chính khác nhau trong một truy vấn trong 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; 

tôi phải làm vài nghìn những câu truy vấn.

Có cách nào tôi có thể "cập nhật hàng loạt" nhiều hàng trong một truy vấn trong PostgreSQL không? Nếu bạn đang sử dụng INSERT, bạn có thể chèn nhiều hàng cùng lúc: (INSERT INTO mytable (column_a, column_b) VALUES ((12, 6), (1, 45));), Có điều gì đó tương tự cho UPDATE không?

Cái gì như:

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

??

Điểm quan trọng là mỗi 'VALUE' sẽ chỉ cập nhật một hàng (dựa trên WHERE id =). Mỗi hàng sẽ có cùng số cột cố định cần cập nhật, nhưng mỗi hàng sẽ có các giá trị khác nhau cho mỗi cột, vì vậy UPDATE mytable SET column_a = 12, column_b = 6 WHERE id IN (1, 2, 3); sẽ không hoạt động.

Trả lời

7

Nếu điều này áp dụng cho trường hợp của bạn, bạn có thể sử dụng nó.

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

Vâng, bạn có thể (và thường nó ưa thích trong SQL) để cập nhật nhiều hàng cùng một lúc. Như vậy là một số cách để làm điều này, nhưng có thể đọc được hầu hết và thanh lịch Tôi nghĩ là sử dụng bảng xuất phát với và giá trị 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 

Không phải như vậy có thể đọc được, nhưng giải pháp rõ ràng hơn sẽ được sử dụng 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

Cách tiếp cận này hiệu quả với tôi !! Cảm ơn!! Cũng làm việc với việc tham gia vào nhiều khóa/cột. Đó là, "trong đó c.id = m.id AND c.column_a = m.column_a"; –