किसी अन्य तालिका से सभी कॉलम अपडेट करें


13

मुझे किसी अन्य से एक तालिका अपडेट करने की आवश्यकता है, और मुझे सभी कॉलम अपडेट करने की आवश्यकता है। SETक्लॉज में हर कॉलम को सूचीबद्ध करने के अलावा , क्या उन सभी को एक साथ अपडेट करने का कोई तरीका है? ऐशे ही:

update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id

मैंने psql में कोशिश की, यह काम नहीं करता है। मुझे हर कॉलम को इस तरह सूचीबद्ध करना है:

update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id

tableBउपयोग बनाया जाता है create .. like tableA। इसलिए वे मूल रूप से समान हैं। और इसका कारण यह है कि मुझे एक अस्थायी तालिका में .csv डेटा लोड करने की आवश्यकता है tableBऔर फिर tableAनए डेटा के आधार पर अपडेट करना होगा tableBtableAजितना संभव हो उतना कम लॉक करने की आवश्यकता है और tableAअखंडता बनाए रखने की आवश्यकता है। मुझे यकीन नहीं है कि 'डिलीट तो इंसर्ट' एक अच्छा विकल्प होगा?


1
मैंने आपके दूसरे कोड के साथ परीक्षण किया, यह काम करता है! आपको दो विषयों की समीक्षा करनी चाहिए: dba.stackexchange.com/questions/58371/… , dba.stackexchange.com/questions/59458/…
Luan Huynh

जवाबों:


12

नहीं है कोई वाक्य रचना संस्करण आप एक बार में पूरी पंक्ति को अद्यतन करने देता है। हालाँकि, आपके पास अब तक की तुलना में एक छोटा रूप है।

साथ ही, आप वास्तव में सभी कॉलम अपडेट नहीं करना चाहते हैं। WHEREकम से कम एक स्तंभ (नीचे आईडी पिन पर हालत id) में कोई बदलाव नहीं करने के लिए। लेकिन यह सिर्फ नाइटपैकिंग है।

UPDATE table_a a
SET    (  c1,   c2, ...)
     = (b.c1, b.c2, ...)
FROM   table_b b
WHERE  a.id = b.id;

इस संबंधित उत्तर में अधिक विवरण:
सभी कॉलमों का बल्क अपडेट

DELETE / INSERT

आंतरिक रूप से, Postgres के MVCC मॉडल के कारण , हर UPDATEप्रभावी रूप से वैसे भी एक नई पंक्ति सम्मिलित करता है और पुराने को अप्रचलित के रूप में चिह्नित करता है। इसलिए, पर्दे के पीछे UPDATEऔर DELETEप्लस के बीच बहुत अंतर नहीं है INSERT। मार्ग के पक्ष में कुछ विवरण
हैं : UPDATE

  • गर्म अद्यतन।
  • टोस्ट टेबल: यदि आपके पास बड़े कॉलम हैं, तो सामग्री संग्रहीत की जा सकती है। टोस्ट टेबल में "आउट-ऑफ-लाइन" और नया पंक्ति संस्करण टोस्ट तालिका में एक ही पंक्ति से लिंक हो सकता है यदि टोस्टेड कॉलम अपरिवर्तित रहते हैं।
  • अपडेट के लिए इंडेक्स मेंटेनेंस सस्ता हो सकता है।

अन्यथा, लॉकिंग उसी के बारे में होनी चाहिए। आपको किसी भी तरह से प्रभावित पंक्तियों पर एक विशेष लॉक की आवश्यकता है। बस इसे जल्दी करो।
यदि आप बड़ी संख्या में पंक्तियों के साथ काम कर रहे हैं और आपको एक सुसंगत स्थिति (सभी पंक्तियों या कोई भी) की आवश्यकता नहीं है, तो आप ऑपरेशन को अन्य बैचों में विभाजित कर सकते हैं। (अलग लेन-देन!) कुल लागत को बढ़ाता है, लेकिन प्रति पंक्ति लॉक समय कम रखता है।


3
DELETE / INSERTकी तुलना में अवांछित या सिर्फ अलग (कैस्केड या ट्रिगर) प्रभाव भी हो सकता है UPDATE
ypercube y

यह सही है लेकिन आपको टेबल_ए के अन्य भाग को अद्यतन करना चाहिए। table_a (जो अद्यतन तालिका है) को एक उपनाम नहीं मिल सकता है।
बस एक और कोड प्रेमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.