तत्व को तालिका में ऊपर उठाने पर 'कॉलम संदर्भ अस्पष्ट है'


16

मैं अपने डेटाबेस के रूप में PostgreSQL का उपयोग कर रहा हूं। और मुझे डेटाबेस में एक प्रविष्टि बनाने की आवश्यकता है, और यदि यह पहले से मौजूद है, तो बस इसके फ़ील्ड्स को अपडेट करें, लेकिन किसी एक फ़ील्ड को केवल तभी अपडेट किया जाना चाहिए जब वह सेट न हो।

मैंने इस प्रश्न से जानकारी का उपयोग किया है: /programming/13305878/dont-update-column-if-update-value-is-null , यह मेरे पास जो है उससे काफी संबंधित है।

मैंने इस क्वेरी का उपयोग करने की कोशिश की, लेकिन जब मैं इसे चलाता हूं, तो इसके साथ त्रुटियां होती हैं Column reference 'affiliate_code' is ambiguous:

INSERT INTO accounts (id, token, affiliate_code)
VALUES (value1, value2, value3)
ON CONFLICT (id) DO
UPDATE SET token = value2,
  affiliate_code = COALESCE(affiliate_code, value3);

(वास्तविक मान प्रतिस्थापित हैं, निश्चित रूप से)।

अगर मैं की जगह affiliate_code = COALESCE(affiliate_code, value3)के साथ affiliate_code = value3, सब कुछ काम करता है, लेकिन नहीं रास्ते में मैं यह काम करना चाहते हैं।

मै इसे काम मे कैसे ले सकता हूँ?

यहां बताया गया है कि मेरी तालिका कैसे परिभाषित की गई है:

CREATE TABLE accounts (
  id VARCHAR NOT NULL UNIQUE,
  token VARCHAR NOT NULL,
  affiliate_code VARCHAR
);

4
कोशिश करो = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code)
ypercube y

जवाबों:


16

डॉक्स से,

conflict_action संघर्ष कार्रवाई पर एक विकल्प निर्दिष्ट करता है। यह या तो DO NOTHING हो सकता है, या एक DO UPDATE क्लॉज एक संघर्ष के मामले में किए जाने वाले UPDATE एक्शन के सटीक विवरण को निर्दिष्ट कर सकता है। CONFLICT DO UPDATE में SET और WHERE क्लॉजेज में टेबल के नाम (या एक उपनाम) का उपयोग करके मौजूदा पंक्ति तक पहुंच है, और विशेष बहिष्कृत टेबल का उपयोग करके सम्मिलन के लिए प्रस्तावित पंक्तियों के लिए। लक्ष्य तालिका में किसी भी स्तंभ पर चयनित विशेषाधिकार की आवश्यकता होती है जहां संबंधित अपवर्जित कॉलम पढ़े जाते हैं।

इसलिए इसके बजाय, प्रति ypercubeᵀᴹ का प्रयास करें

INSERT INTO accounts (id, token, affiliate_code)
VALUES (value1, value2, value3)
ON CONFLICT (id) DO
UPDATE SET token = value2,
  affiliate_code = COALESCE(accounts.affiliate_code, excluded.affiliate_code);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.