आपको उस कॉलम को टेबल-क्वालिफाई करना होगा जहां यह अन्यथा अस्पष्ट होगा।
वर्चुअल टेबल नाम का उपयोग करें excluded
इनपुट पंक्ति को संदर्भित करने के लिए। लेकिन आप शायद लक्ष्य कॉलम का उल्लेख करना चाहते हैं, इसलिए लक्ष्य तालिका के नाम के साथ योग्यता प्राप्त करें:
INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1 -- here
RETURNING count;
वर्चुअल इनपुट तालिका से एकल पंक्ति excluded
इसमें सभी शामिल हैं लक्ष्य तालिका के स्तंभ, भले ही INSERT
. के लक्ष्य स्तंभ सूची में सूचीबद्ध न हों या VALUES
अभिव्यक्ति। तो आप जिस अस्पष्टता का सामना कर रहे हैं वह हमेशा बनी रहती है, चाहे count
स्पष्ट रूप से लक्षित है या नहीं।
इसके अलावा:लक्ष्य कॉलम सूची में छोड़े गए कॉलम उनके संबंधित कॉलम DEFAULT
के लिए डिफ़ॉल्ट हैं मान, जो NULL
. है डिफ़ॉल्ट रूप से (NULL
डिफ़ॉल्ट कॉलम होने के नाते DEFAULT
) यानी, यह डिफ़ॉल्ट रूप से NULL
. होगा आपके सेटअप में और 1
नीचे मेरे बेहतर सेटअप में। और पंक्ति-स्तरीय ट्रिगर BEFORE INSERT
(यदि कोई हो) लागू होते हैं।
लेकिन इनमें से कोई भी उदाहरण के लिए लागू नहीं होता क्योंकि यह लक्ष्य . को संदर्भित करता है आखिर कॉलम।
विशेष रूप से, कॉलम नाम के अन्य दो उदाहरण count
स्पष्ट हैं (और इस प्रकार तालिका-योग्यता की आवश्यकता नहीं है) क्योंकि वे केवल लक्ष्य को संदर्भित कर सकते हैं टेबल।
कॉलम count
. के दौरान आपका सेटअप आसानी से टूट सकता है परिभाषित नहीं है NOT NULL
, NULL + 1
. के रूप में अभी भी NULL
है . यह सेटअप अधिक सार्थक होगा:
CREATE TABLE test.test_counter (
id text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);
मेरे उदाहरण में उद्धृत CaMeL- केस नामों का भी उपयोग नहीं करना। देखें: