পূর্ণসংখ্যায় বারচার ক্ষেত্রের ধরণ পরিবর্তন করুন: "পূর্ণসংখ্যার টাইপ করতে স্বয়ংক্রিয়ভাবে কাস্ট করা যায় না"


153

আমার একটি ছোট টেবিল রয়েছে এবং একটি নির্দিষ্ট ক্ষেত্রে " চরিত্রের ভিন্নতা " টাইপ রয়েছে । আমি এটি " পূর্ণসংখ্যার " এ পরিবর্তনের চেষ্টা করছি তবে এটি একটি ত্রুটি দেয় যে castালাই সম্ভব নয়।

এর আশেপাশে কোনও উপায় আছে বা আমার কি অন্য একটি টেবিল তৈরি করা উচিত এবং কোয়েরি ব্যবহার করে এটিতে রেকর্ডগুলি আনতে হবে?

ক্ষেত্রটিতে কেবল পূর্ণসংখ্যার মান রয়েছে।


কোন নির্দিষ্ট টেবিলটি আপনি চেষ্টা করেছিলেন এবং নির্দিষ্ট ত্রুটি বার্তাটি কী ছিল?
মিউ খুব ছোট

@miistooshort আমি phppgadmin থেকে পরিবর্তনকারী ব্যবহার করার চেষ্টা করেছি। কলামটি নির্বাচন করা হয়েছে এবং নতুন ক্ষেত্রের ধরণটি ইনপুট করার চেষ্টা করেছে। ত্রুটি:SQL error: ERROR: column "MID" cannot be cast to type integer
itsols

3
প্রথম টেবিল ব্যাকআপ করা হয়। তারপরে আপনি একই টেবিলটিতে আরও একটি কলাম তৈরি করতে পারেন (ফিল্ড 2 বলুন) type ফিল্ড 1 এর পূর্ণসংখ্যা মানটিকে ফিল্ড 2 তে নির্বাচন করুন। তারপরে কলামটির নাম পরিবর্তন করুন।
ইগোর

@ ইগোর কিন্তু নতুন কলামটি টেবিলের শেষে পড়েছে? আমি কি একই পজিশনে থাকতে পারি না?
itols

2
@itsols কলাম পজিশনের যত্ন নেওয়া সাধারণত iffy অ্যাপ্লিকেশন ডিজাইনের লক্ষণ। আপনি প্রায় সর্বদা স্পষ্টভাবে নামযুক্ত কলাম এবং SELECTতালিকাগুলি ব্যবহার করতে চান , কলাম সাধারণ অবস্থানের উপর নির্ভর না করে lying এটি বলেছিল, উত্তরে প্রদত্ত পদ্ধতির সাহায্যে কলাম অবস্থান রক্ষা করবে।
ক্রেগ রিঞ্জার

উত্তর:


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 আপনাকে সম্পূর্ণ ত্রুটিটি দেখাচ্ছে না। আমি psqlপোস্টগ্র্রেএসকিউএল 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লিঙ্কটি যুক্ত করার জন্য @ মিমিস্টোশোর্টকে ধন্যবাদ ।

আরও দেখুন এই সংশ্লিষ্ট প্রশ্ন ; এটি রেল স্থানান্তর সম্পর্কে, তবে অন্তর্নিহিত কারণ একই এবং উত্তর প্রযোজ্য।

ত্রুটিটি এখনও যদি ঘটে থাকে তবে এটি কলাম মানগুলির সাথে সম্পর্কিত নয় তবে এই কলাম বা কলামের ডিফল্ট মানগুলির সূচকগুলি টাইপকাস্টে ব্যর্থ হতে পারে। ALTER COLUMN এর আগে সূচিগুলি বাদ দিতে হবে এবং পরে পুনরায় তৈরি করতে হবে। ডিফল্ট মানগুলি যথাযথভাবে পরিবর্তন করা উচিত।


সময় দেবার জন্য আপনাকে ধন্যবাদ। কিন্তু আমি এই কাজ পেতে বলে মনে হয় না। আমি আপনার অলটার লাইনটি চেষ্টা করেছি এবং এটি আমাকে "ত্রুটির সাথে ব্যবহারের সিনট্যাক্স ত্রুটি" দেয়
অলস

আমার বক্তব্য: ALTER TABLE "tblMenus" ALTER COLUMN "MID" USING (trim ("MID") :: :: পূর্ণসংখ্যা);
itols

1
@itsols আমার সম্পূর্ণ ভুল; আমি যেমন আপনার মন্তব্য দেখেছি ঠিক তেমনটিই সংশোধন করেছি। সংশোধিত দেখুন। এটি ডেমো কোডে ঠিক ছিল, শুরুতে সাধারণ উদাহরণটিই নয়।
ক্রেগ রিঞ্জার

অসংখ্য ধন্যবাদ! এই উত্তরটি আমাকে অনেক ঝামেলা ও সময় বাঁচিয়েছে। আমি ভাবছি কেন নীথার phppgadmin বা pgadmin এর বৈশিষ্ট্য হিসাবে আছে ...
itos

@itsols মূল দলটির বেশিরভাগই পিজএডমিনে আগ্রহী নন এবং তাদের মধ্যে কয়েকজনই এটি ব্যবহার করেন। এটিতে কিছু বিরক্তিকর ব্যবহারযোগ্যতা ওয়ার্ট এবং কার্যকারিতা সীমাবদ্ধতা রয়েছে। এটি তাদের অনেকের মধ্যে একটি। কারণ খুব কম বিশেষজ্ঞরা পিজএডমিন ব্যবহার করেন তারা এগুলিকে বিরক্ত করতে পারে এমন জিনিসগুলি ঠিক করতে উত্সাহিত হন না। আমি নিজে এটি ব্যবহার করি না, কারণ আমি psqlআরও দ্রুত এবং সহজ খুঁজে পাই । কিছুক্ষণ আগে ব্যাকআপ এবং পুনরুদ্ধার করার বিষয়ে PgAdmin ব্যবহারের সম্পর্কে আমি খানিকটা রেন্ট লিখেছি: blog.ringerc.id.au/2012/05/…
ক্রেগ

69

এটি আমার জন্য কাজ করেছে।

ভার্চার কলামটি ইনট-এ পরিবর্তন করুন

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
যতক্ষণ কলামটিতে যা আছে এটি পূর্ণসংখ্যা, হ্যাঁ
বিবাংবা

এটা আমার সাথে কাজ করে না। আমি রুবি ২.২.৩ ব্যবহার করছি রেলের সাথে 4.2.3
থিনহ ডি বুয়

@ থিনহডি.বুই - আমার জন্য কাজ করে, ২.৩.০, রেল ৪.২..6
ফিলিপ


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

তবে পোস্টগ্র্যাস এসকিউএল অভিযোগ করবে:

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)'

উপরেরগুলি অন্যান্য ডাটাবেস অ্যাডাপ্টারগুলি থেকে আপনি কী জানেন তা নকল করবে। যদি আপনার অ-সংখ্যাসূচক ডেটা থাকে তবে ফলাফলগুলি অপ্রত্যাশিত হতে পারে (তবে আপনি কোনও সংখ্যায় রূপান্তর করছেন, সর্বোপরি)।


আমি আরও একটি পয়েন্ট যোগ করতে চেয়েছিলাম যে, চেঞ্জ_কলামের সাথে সতর্ক থাকুন। এটা অপরিবর্তনীয়। আমি এটিকে বিপরীতমুখী করতে মাইগ্রেশনে উপরে এবং নীচে ব্যবহার করার পরামর্শ দিই।
মুকেশ কুমার গুপ্ত

2
PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: ""ত্রুটি ঘটে
শাইগ খালিগলি

6

আমি একই সমস্যা পেয়েছি। আমি যে কলামটি পরিবর্তনের চেষ্টা করছি তার জন্য আমার ডিফল্ট স্ট্রিংয়ের মান আছে বুঝতে পেরেছি। ডিফল্ট মান মুছে ফেলার ফলে ত্রুটি চলে গেছে :)


এছাড়াও এই কলামে বিদ্যমান সূচিগুলি একটি সমস্যা হতে পারে। এগুলি ALTER এর আগে ফেলে দেওয়া এবং পরে পুনরায় তৈরি করা দরকার।
এনভেক

1

আপনি যদি দুর্ঘটনাক্রমে বা টেক্সট ডেটার সাথে পূর্ণসংখ্যার মিশ্রণ না পেয়ে থাকেন তবে প্রথমে আপনাকে প্রথমে আপডেট কমান্ডের নীচে কার্যকর করা উচিত (যদি না উপরে পরিবর্তিত টেবিলটি ব্যর্থ হয়):

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

3
আপনি regexp_replace(col_name, '[^0-9.]','','g')যদি অবাঞ্ছিত চরিত্র এবং সাদা স্থান ছিনিয়ে নেওয়ার চেষ্টা করছেন তবে এমন কিছু নিয়ে আপনি আরও ভাল হতে চাই । আপনি কিছু প্রয়োজন চাই একটি বিট আরো পরিশীলিত যদি আপনি বজায় রাখতে চান NaNএবং Infএবং 10E42, যদিও বৈজ্ঞানিক স্বরলিপি।
ক্রেগ রিঞ্জার

1

আপনি যদি বিকাশের পরিবেশের উপর কাজ করছেন (বা উত্পাদনের পক্ষে যেমন এটি আপনার ডেটা ব্যাকআপ করতে পারে) তবে প্রথমে ডিবি ক্ষেত্র থেকে ডেটা সাফ করুন বা মান হিসাবে 0 হিসাবে সেট করুন।

UPDATE table_mame SET field_name= 0;

এরপরে নীচের ক্যোয়ারীটি চালাতে এবং সফলভাবে ক্যোয়ারি চালানোর পরে স্কিমেগ্রেজে এবং তারপরে মাইগ্রেট স্ক্রিপ্টটি চালান।

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

আমি মনে করি এটি আপনাকে সাহায্য করবে।


0

আমারো একই ইস্যু ছিল. আমি কলামটির ডিফল্ট পুনরায় সেট করতে শুরু করেছি।

change_column :users, :column_name, :boolean, default: nil
change_column :users, :column_name, :integer, using: 'column_name::integer', default: 0, null: false
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.