अपडेट करें: इस बग को PostgreSQL v12 में कमिट के साथ ठीक किया गया है 19781729f78
.
शेष उत्तर पुराने संस्करणों के लिए प्रासंगिक है।
एक serial
कॉलम में एक अनुक्रम होता है जो कॉलम और DEFAULT
. के स्वामित्व में होता है वह मान जो शुद्ध अनुक्रम मान प्राप्त करता है।
यदि आप उस कॉलम को पहचान कॉलम में बदलने का प्रयास करते हैं, तो आपको एक त्रुटि मिलेगी कि कॉलम के लिए पहले से ही एक डिफ़ॉल्ट मान है।
अब आपने डिफ़ॉल्ट मान को छोड़ दिया होगा, लेकिन उस क्रम को नहीं जो serial
. से संबंधित है कॉलम। फिर जब आपने कॉलम को एक पहचान कॉलम में परिवर्तित किया, तो कॉलम के स्वामित्व वाला एक दूसरा क्रम बनाया गया।
अब जब आप एक पंक्ति सम्मिलित करने का प्रयास करते हैं, PostgreSQL द . को खोजने और उपयोग करने का प्रयास करता है अनुक्रम स्तंभ के स्वामित्व में है, लेकिन दो हैं, इसलिए त्रुटि संदेश।
मेरा तर्क है कि यह PostgreSQL में एक बग है:मेरी राय में, इसे या तो पहचान कॉलम के लिए मौजूदा अनुक्रम को फिर से तैयार करना चाहिए था या आपको एक त्रुटि दी गई थी कि कॉलम के स्वामित्व में पहले से ही एक अनुक्रम है, और आपको इसे छोड़ देना चाहिए। मैं इस बग को ठीक करने की कोशिश करूंगा ।
इस बीच, आपको serial
. से पीछे छोड़े गए अनुक्रम को मैन्युअल रूप से छोड़ देना चाहिए कॉलम। निम्नलिखित क्वेरी चलाएँ:
SELECT d.objid::regclass
FROM pg_depend AS d
JOIN pg_attribute AS a ON d.refobjid = a.attrelid AND
d.refobjsubid = a.attnum
WHERE d.classid = 'pg_class'::regclass
AND d.refclassid = 'pg_class'::regclass
AND d.deptype <> 'i'
AND a.attname = 'patientid'
AND d.refobjid = 'patient'::regclass;
यह आपको serial
. से पीछे छोड़े गए अनुक्रम का नाम देना चाहिए कॉलम। इसे छोड़ दें, और पहचान कॉलम वांछित व्यवहार करना चाहिए।