পোস্টগ্রিএসকিউএল 8.4-এ কীভাবে কলামের ডেটাটাইপকে অক্ষর থেকে সংখ্যায়িত করা যায়


136

আমি নিম্নলিখিত কোয়েরি ব্যবহার করছি:

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

থেকে একটি কলামের ডেটাটাইপ পরিবর্তন character(20)করতে numeric(10,0)কিন্তু আমি ত্রুটি পাচ্ছি:

সংখ্যার টাইপ করতে কলাম "কোড" কাস্ট করা যাবে না

উত্তর:


240

আপনি ব্যবহার করে দেখতে পারেন USING:

ঐচ্ছিক USINGদফা পুরাতন থেকে নতুন কলাম মান গনা করা হবে তা নির্ধারণ; বাদ দেওয়া থাকলে, ডিফল্ট রূপান্তরটি পুরানো ডেটা টাইপ থেকে নতুন হিসাবে অ্যাসাইনমেন্টের মতো is 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যা সংখ্যায় কাস্ট করা যায় না; যদি ব্যবহার ব্যর্থ হয়, কলামের ধরণ পরিবর্তন করার আগে আপনাকে হাত দ্বারা অ-সংখ্যাসূচক ডেটা পরিষ্কার করতে হবে।


এই কলামটি অন্য টেবিলে বিদেশী কী হিসাবে ব্যবহৃত হয়, আমার ধারণা আমিও সেটির ডেটাটাইপটি পরিবর্তন করতে হবে?
user728630

2
@ ব্যবহারকারী 7২66 You০: আপনাকে এফকে ছেড়ে দিতে হবে, উভয় কলাম পরিবর্তন করতে হবে এবং তারপরে এফকে ফিরে যুক্ত করতে হবে। আপনার সাথে খেলতে টেস্ট ডাটাবেস এবং প্রোডাকশন ডাটাবেসের ব্যাকআপ আছে, তাই না?
মিউ খুব কম

আমি বিদেশী কী বাধা মুছে ফেলেছি, ডেটাটাইপ পরিবর্তন করেছি তবে তারপরে এফকে যুক্ত করতে অক্ষম। নিম্নলিখিত ত্রুটিটি পাওয়া ERROR: সারণি "ইনভয়েসগুলি" সন্নিবেশ করানো বা আপডেট করা বিদেশী কী বাধা "ইনভয়েস_প্রেসেল_ফেক" DETAIL লঙ্ঘন করে: কী (বিক্রয়, cpf_cnpj) = (4,05943560000101) সারণীতে উপস্থিত নেই "প্রেসালগুলি"।
ইউজার 728630

2
@funwhilelost এটা একটা ব্যাপার টাইপ কাস্ট । লিঙ্কযুক্ত অল্টার টেবিল ডকসগুলি আপনি ব্যবহারের মাধ্যমে কী ব্যবহার করতে পারবেন তা কভার করে।
মিউ খুব সংক্ষিপ্ত

3
@ মমিস্টুশোর্ট আমি ডক্স থেকে দেখছি এটি আসলে একটি অভিব্যক্তি। এটি আরও অর্থবোধ করে। ধরণের কাস্ট আমাকে গ্রেফতার করে ফেলল। আমি শেষ করেছিTYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
ফ্যান্টলস্টেস্ট

7

আপনার যদি VARCHARকলাম খালি স্ট্রিং (যা রয়েছে না হিসাবে একই NULLপোস্টগ্রি জন্য আপনি পুনরাহ্বান হতে পারে) আপনি একটি ডিফল্ট সেট করতে নিচের লাইনে কিছু ব্যবহার করতে হবে:

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

( এই উত্তরের সাহায্যে পাওয়া গেছে )

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.