एकाधिक समस्याएं।
आपका सेटअप, विस्तारित:
CREATE TABLE a (
pk_a int PRIMARY KEY
, a int
, comment text -- added column to make effect clear
);
CREATE TABLE b (
pk_b int PRIMARY KEY
, b int
, comment text
);
INSERT INTO a VALUES (1, 11, 'comment from a')
, (2, 22, 'comment from a');
INSERT INTO b VALUES (1, 77, 'comment from b');
यह काम:
INSERT INTO b (pk_b, b, comment)
SELECT pk_a, a, comment
FROM a
ON CONFLICT (pk_b) DO UPDATE -- conflict is on the unique column
SET b = excluded.b; -- key word "excluded", refer to target column
परिणाम:
TABLE b;
pk_b | b | comment
------+----+----------------
1 | 11 | comment from b -- updated
2 | 22 | comment from a -- inserted
समस्याये
आप भ्रमित कर रहे हैं table_a
और A
आपके डेमो में (जैसे @Abelisto ने टिप्पणी की )।
कानूनी, निचले मामले का उपयोग करते हुए, अयोग्य पहचानकर्ता भ्रम से बचने में मदद करता है।
जैसे @Ziggy का उल्लेख किया गया है , ON CONFLICT
केवल वास्तविक अद्वितीय या बहिष्करण बाधा के लिए काम करता है । नियम पुस्तिका:
वैकल्पिक ON CONFLICT
क्लॉज एक अद्वितीय उल्लंघन या अपवर्जन बाधा उल्लंघन त्रुटि को बढ़ाने के लिए एक वैकल्पिक कार्रवाई को निर्दिष्ट करता है।
नतीजतन, ON CONFLICT (b)
वहाँ काम नहीं कर सकता, कोई अड़चन नहीं। ON CONFLICT (pk_b)
काम करता है।
जैसे @Ziggy का भी उल्लेख किया गया है , स्रोत तालिका के नामUPDATE
भाग में दिखाई नहीं देते हैं । नियम पुस्तिका:
SET
और WHERE
में खंड ON CONFLICT DO UPDATE
तालिका का नाम (या एक उपनाम) का उपयोग कर मौजूदा पंक्ति के लिए उपयोग किया है, और करने के लिए विशेष का उपयोग कर प्रविष्टि के लिए प्रस्तावित पंक्तियों excluded
तालिका ।
बोल्ड जोर मेरा।
आप भाग में स्रोत तालिका के स्तंभ नामों का भी उपयोग नहीं कर सकते UPDATE
। यह लक्ष्य पंक्ति का कॉलम नाम होना चाहिए । तो आप वास्तव में चाहते हैं:
SET b = excluded.b
एक बार फिर मैनुअल:
ध्यान दें कि सभी प्रति पंक्ति BEFORE INSERT
ट्रिगर के प्रभाव बहिष्कृत मूल्यों में परिलक्षित होते हैं, क्योंकि उन प्रभावों को सम्मिलन से बाहर जाने वाली पंक्ति में योगदान हो सकता है।
CREATE TABLE A...
तालिका बनाता हैa
, नहींtable_a
।