PostgreSQL 8.4 में चरित्र से संख्यात्मक में कॉलम डेटाटाइप को कैसे बदलें


136

मैं निम्नलिखित प्रश्न का उपयोग कर रहा हूं:

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 

किसी कॉलम का डेटाटाइप बदलने के character(20)लिए, numeric(10,0)लेकिन मुझे त्रुटि मिल रही है:

स्तंभ "कोड" को संख्यात्मक टाइप करने के लिए नहीं डाला जा सकता है

जवाबों:


240

आप प्रयोग करके देख सकते हैं USING:

वैकल्पिक USINGखंड निर्दिष्ट करता है कि पुराने से नए कॉलम मान की गणना कैसे करें; यदि छोड़ दिया जाता है, तो डिफ़ॉल्ट रूपांतरण पुराने डेटा प्रकार से नए में असाइनमेंट कास्ट के समान है। USINGयदि पुराने से नए प्रकार का कोई निहित या असाइनमेंट नहीं है, तो एक खंड प्रदान किया जाना चाहिए।

तो यह काम कर सकता है (आपके डेटा के आधार पर):

alter table presales alter column code type numeric(10,0) using code::numeric;
-- Or if you prefer standard casting...
alter table presales alter column code type numeric(10,0) using cast(code as numeric);

यह विफल हो जाएगा अगर आपके पास कुछ भी है codeजो संख्यात्मक को नहीं डाला जा सकता है; यदि USING विफल होता है, तो आपको कॉलम प्रकार बदलने से पहले गैर-संख्यात्मक डेटा को हाथ से साफ़ करना होगा।


इस स्तंभ का उपयोग किसी अन्य तालिका में एक विदेशी कुंजी के रूप में किया जाता है, मुझे लगता है कि मुझे इसका भी डेटाटाइप बदलना होगा?
user728630

2
@ user728630: आपको FK को छोड़ना होगा, दोनों कॉलम को बदलना होगा, और फिर FK को वापस जोड़ना होगा। आपके पास खेलने के लिए एक परीक्षण डेटाबेस है और उत्पादन डेटाबेस का बैकअप है, है ना?
म्यू बहुत छोटा है

मैंने विदेशी कुंजी बाधा को हटा दिया, डेटाटाइप को बदल दिया लेकिन उसके बाद FK को जोड़ने में असमर्थ। निम्न त्रुटि प्राप्त करना ERROR: टेबल पर सम्मिलित करें या "इनवॉइस" पर अपडेट करें विदेशी कुंजी बाधा "इनवॉयस_स्पर्श_फेक" विवरण का उल्लंघन करता है: कुंजी (बिक्री, cpf_cnpj) = (4,0594,00060000101) तालिका में "प्रिस्लेस" मौजूद नहीं है।
user728630

2
@funwhilelost यह एक प्रकार की कास्ट है । लिंक किए गए अलर्ट टेबल डॉक्स का उपयोग करते हैं जो आप उपयोग कर सकते हैं।
म्यू

3
@ muistooshort मैं डॉक्स से देखता हूं यह वास्तव में एक अभिव्यक्ति है। यह अधिक समझ में आता है। टाइप कास्ट ने मुझे गार्ड ऑफ कर दिया। मैं के साथ समाप्त हो गयाTYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
funwhilelost

7

यदि आपके VARCHARकॉलम में खाली तार हैं (जो पोस्टग्रेक्यूएल के समान नहीं हैं , जैसा NULLकि आप याद कर सकते हैं) तो आपको डिफ़ॉल्ट सेट करने के लिए निम्नलिखित में से कुछ का उपयोग करना होगा:

ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
            USING COALESCE(NULLIF(code, '')::NUMERIC, 0);

( इस जवाब की मदद से मिला )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.