प्रकार के varchar फ़ील्ड को पूर्णांक में बदलें: "पूर्णांक टाइप करने के लिए स्वचालित रूप से कास्ट नहीं किया जा सकता है"


154

मेरे पास एक छोटी सी मेज है और एक निश्चित क्षेत्र में " चरित्र भिन्न " प्रकार है । मैं इसे " पूर्णांक " में बदलने की कोशिश कर रहा हूं, लेकिन यह एक त्रुटि देता है कि कास्टिंग संभव नहीं है।

क्या इसके आस-पास कोई रास्ता है या मुझे बस एक और तालिका बनानी चाहिए और एक क्वेरी का उपयोग करके रिकॉर्ड लाना चाहिए।

फ़ील्ड में केवल पूर्णांक मान होते हैं।


आपके द्वारा किए गए विशिष्ट परिवर्तन ने क्या किया और क्या विशिष्ट त्रुटि संदेश था?
म्यू बहुत छोटा है

@ muistooshort मैंने phppgadmin से परिवर्तन का उपयोग करने का प्रयास किया। कॉलम का चयन किया और नए फ़ील्ड प्रकार के इनपुट की कोशिश की। त्रुटि है:SQL error: ERROR: column "MID" cannot be cast to type integer
इसकी

3
सबसे पहले बैकअप टेबल है। तब आप एक ही तालिका में पूर्णांक प्रकार का एक और कॉलम (फ़ील्ड कह सकते हैं) बना सकते हैं। फ़ील्ड 1 में फ़ील्ड 1 के पूर्णांक मान के लिए कलाकारों का चयन करें। फिर कॉलम का नाम बदलें।
इगोर

@Igor लेकिन नया स्तंभ सही तालिका के अंत में आता है? क्या मैं इसे उसी स्थिति में नहीं रख सकता?
3

2
@itsols स्तंभ पदों के बारे में देखभाल आमतौर पर iffy एप्लिकेशन डिज़ाइन का संकेत है। आप लगभग हमेशा कॉलम और SELECTसूचियों में स्पष्ट रूप से नामित कॉलम और सूचियों का उपयोग करना चाहते हैं , स्तंभ संबंधी पदों पर निर्भर नहीं हैं। उस ने कहा, उत्तर में दिए गए दृष्टिकोण कॉलम स्थिति को संरक्षित करेगा।
क्रेग रिंगर 3

जवाबों:


264

कोई अंतर्निहित (स्वचालित) कलाकारों से है textया varcharकरने के लिए integer(यानी आप एक पारित नहीं हो सकता varcharकी उम्मीद कर एक समारोह के लिए integerया एक आवंटित varcharएक करने के लिए क्षेत्र integer, एक) ताकि आप एक स्पष्ट कलाकारों का उपयोग कर निर्दिष्ट करना होगा ALTER तालिका ... ALTER स्तंभ ... प्रकार। .. उपयोग :

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);

ध्यान दें कि आपके टेक्स्ट फ़ील्ड में व्हॉट्सएप हो सकता है; उस स्थिति में, उपयोग करें:

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);

परिवर्तित करने से पहले सफेद स्थान पर पट्टी करना

यदि आदेश चलाया गया था psql, तो यह त्रुटि संदेश से स्पष्ट हो गया है , लेकिन यह संभव है कि PgAdmin-III आपको पूर्ण त्रुटि नहीं दिखा रहा है। यहाँ क्या होता है अगर मैं इसे psqlPostgreSQL 9.2 पर परीक्षण करूँ :

=> CREATE TABLE test( x varchar );
CREATE TABLE
=> insert into test(x) values ('14'), (' 42  ');
INSERT 0 2
=> ALTER TABLE test ALTER COLUMN x TYPE integer;
ERROR:  column "x" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion. 
=> ALTER TABLE test ALTER COLUMN x TYPE integer USING (trim(x)::integer);
ALTER TABLE        

USINGलिंक जोड़ने के लिए @muistooshort धन्यवाद

इससे संबंधित प्रश्न भी देखें ; यह रेलों के पलायन के बारे में है, लेकिन अंतर्निहित कारण समान है और उत्तर लागू होता है।

यदि त्रुटि अभी भी होती है, तो यह कॉलम मानों से संबंधित नहीं हो सकती है, लेकिन इस कॉलम या कॉलम डिफ़ॉल्ट मानों पर अनुक्रमणिका टाइपकास्ट विफल हो सकती हैं। अनुक्रमणिका को ALTER COLUMN से पहले छोड़ने और उसके बाद पुनः बनाए जाने की आवश्यकता है। डिफ़ॉल्ट मानों को उचित रूप से बदला जाना चाहिए।


समय देने के लिए धन्यवाद। लेकिन मुझे यह काम नहीं मिल रहा है। मैंने आपकी ALTER लाइन को आज़माया और इससे मुझे "सिंटैक्स की त्रुटि का उपयोग करने के पास त्रुटि"
मिली

मेरा कथन: ALTER TABLE "tblMenus" ALTER COLUMN "MID" का उपयोग करना (ट्रिम ("MID") :: पूर्णांक);
इसका नाभि

1
@itsols पूरी तरह से मेरी गलती; जैसे ही मैंने आपकी टिप्पणी देखी मैंने इसे ठीक कर दिया। संशोधित देखें। यह डेमो कोड में सही था, न कि शुरुआत में सामान्य उदाहरण।
क्रेग रिंगर

बहुत - बहुत धन्यवाद! इस जवाब ने मुझे बहुत परेशानी और समय बचाया। मुझे आश्चर्य है कि क्यों नीफर phppgadmin और न ही pgadmin यह एक विशेषता के रूप में है ...
इसकी

@itsols अधिकांश कोर टीम PgAdmin में दिलचस्पी नहीं रखती है, और उनमें से कुछ इसका उपयोग करते हैं। यह कुछ कष्टप्रद प्रयोज्य मौसा और कार्यक्षमता सीमाएँ हैं। यह उनमें से कई में से केवल एक है। क्योंकि कुछ विशेषज्ञ PgAdmin का उपयोग करते हैं क्योंकि वे उन चीजों को ठीक करने के लिए प्रेरित नहीं होते हैं जो उन्हें इसके बारे में परेशान करेंगे। मैं खुद इसका उपयोग नहीं करता, क्योंकि मुझे psqlबहुत तेज और आसान लगता है। मैंने बैकअप के संबंध में PgAdmin प्रयोज्य के बारे में एक शेख़ी का एक सा लिखा है और थोड़ी देर पहले बहाल: blog.ringerc.id.au/2012/05/…
क्रेग रिंगर

70

यह मेरे लिए काम किया।

varchar कॉलम को int में बदलें

change_column :table_name, :column_name, :integer

मिल गया:

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

के लिए chnged

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

क्या आपने डेटा के साथ इस अभ्यास की कोशिश की और क्या आपका डेटा बरकरार था?
इसकी जूल

3
जब तक कॉलम में है, तब तक एक पूर्णांक है, हां
bibangamba

यह मेरे साथ काम नहीं करता है। मैं रूबी के साथ रूबी 2.2.3 का उपयोग कर रहा हूं

@ ThinhD.Bui - मेरे लिए काम करता है, 2.3.0, रेल 4.2.6
फिलिप

1
चूक के साथ ही सावधान रहें
फ्रांसिस्को क्विंटो

17

आप इसे कर सकते हैं जैसे:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

या यह प्रयास करें:

change_column :table_name, :column_name, :integer, using: 'column_name::integer'

यदि आप इस विषय के बारे में और जानने के लिए इच्छुक हैं, तो इस लेख को पढ़ें: https://kolosek.com/rails-change-database-column


8

यह कोशिश करो, यह सुनिश्चित करने के लिए काम करेगा।

जब आप एक स्ट्रिंग कॉलम को पूर्णांक में बदलने के लिए रेल माइग्रेशन लिखते हैं, तो आप आमतौर पर कहेंगे:

change_column :table_name, :column_name, :integer

हालाँकि, PostgreSQL शिकायत करेगा:

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

"संकेत" मूल रूप से आपको बताता है कि आपको यह पुष्टि करने की आवश्यकता है कि आप ऐसा करना चाहते हैं, और डेटा कैसे परिवर्तित किया जाएगा। इसे अपने माइग्रेशन में कहें:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

ऊपर जो आप अन्य डेटाबेस एडेप्टर से जानते हैं, उसकी नकल करेंगे। यदि आपके पास गैर-संख्यात्मक डेटा है, तो परिणाम अप्रत्याशित हो सकते हैं (लेकिन आप एक पूर्णांक में परिवर्तित कर रहे हैं, आखिरकार)।


मैं सिर्फ एक और बिंदु जोड़ना चाहता था, जो change_column से सावधान रहे। यह अपरिवर्तनीय है। मेरा सुझाव है कि इस प्रतिवर्ती को बनाने के लिए प्रवास में ऊपर और नीचे का उपयोग करें।
मुकेश कुमार गुप्ता

2
PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: ""त्रुटि होती है
शैग खलीगली

6

मुझे भी यही समस्या हुई। मुझे एहसास हुआ कि मैं उस कॉलम के लिए एक डिफ़ॉल्ट स्ट्रिंग मान था जिसे मैं बदलने की कोशिश कर रहा था। डिफ़ॉल्ट मान को हटाने से त्रुटि दूर हो गई :)


इस स्तंभ पर मौजूदा अनुक्रमित भी एक समस्या हो सकती है। उन्हें ALTER से पहले छोड़ने और उसके बाद फिर से बनाने की आवश्यकता है।
Envek

1

यदि आपने गलती से या पूर्ण रूप से टेक्स्ट डेटा के साथ पूर्णांक नहीं मिलाया है, तो आपको अपडेट कमांड के नीचे पहले निष्पादित करना चाहिए (यदि परिवर्तन तालिका से ऊपर नहीं होगा तो विफल हो जाएगा):

UPDATE the_table SET col_name = replace(col_name, 'some_string', '');

3
regexp_replace(col_name, '[^0-9.]','','g')यदि आप अवांछित पात्रों और सफेद-स्थान को छीनने की कोशिश कर रहे हैं , तो आप कुछ बेहतर कर सकते हैं। तुम कुछ आवश्यकता होगी थोड़ा और अधिक परिष्कृत यदि आप बनाए रखना चाहते NaNहैं और Infऔर 10E42, हालांकि वैज्ञानिक संकेतन।
क्रेग रिंगर

1

यदि आप विकास के माहौल पर काम कर रहे हैं (या उत्पादन env के लिए। यह आपके डेटा का बैकअप हो सकता है) तो सबसे पहले DB क्षेत्र से डेटा को साफ़ करने के लिए या मान को 0 के रूप में सेट करें।

UPDATE table_mame SET field_name= 0;

उसके बाद नीचे की क्वेरी को चलाने के लिए और क्वेरी को सफलतापूर्वक स्कीम माइग्रेशन में चलाने के लिए और उसके बाद माइग्रेट स्क्रिप्ट को चलाने के लिए।

ALTER TABLE table_mame ALTER COLUMN field_name TYPE numeric(10,0) USING field_name::numeric;

मुझे लगता है कि यह आपकी मदद करेगा।


1

मेरी भी यही समस्या थी। मैंने कॉलम के डिफ़ॉल्ट को रीसेट करना शुरू कर दिया।

change_column :users, :column_name, :boolean, default: nil
change_column :users, :column_name, :integer, using: 'column_name::integer', default: 0, null: false
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.