2013-09-21 9 views
10

मुझे PostgreSQL 9.1 में कई पंक्तियों में कई कॉलम अपडेट करना होगा।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; 

मैं इन प्रश्नों के कई हजारों क्या करना है: मैं वर्तमान में हर एक है कि एक अलग पंक्ति पर काम करता है (प्राथमिक कुंजी के आधार पर) कई अलग अलग UPDATE प्रश्नों के साथ कर रहा हूँ,।

वहाँ वैसे भी है मैं यह कर सकते हैं "बहु-अपडेट" पंक्तियों की एक क्वेरी में 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

हाँ, आप (और आमतौर पर यह एसक्यूएल में पसंद किया है) कर सकते हैं एक बार में कई पंक्तियों को अद्यतन करने के। ऐसा करने के लिए कुछ तरीके हैं, लेकिन सबसे अधिक पठनीय और सुरुचिपूर्ण मुझे लगता है कि पहचान-पत्र और मूल्यों के साथ ली गई तालिका का उपयोग करने के लिए है:

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

यह दृष्टिकोण मेरे लिए बहुत अच्छा काम करता है !! धन्यवाद!! एकाधिक कुंजी/कॉलम पर शामिल होने के साथ भी काम करता है। यही है, "जहां c.id = m.id और c.column_a = m.column_a"; –

संबंधित मुद्दे