วิธีการเปลี่ยนประเภทข้อมูลคอลัมน์จากอักขระเป็นตัวเลขใน PostgreSQL 8.4


137

ฉันใช้แบบสอบถามต่อไปนี้:

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

หากต้องการเปลี่ยนประเภทข้อมูลของคอลัมน์จากcharacter(20)เป็นnumeric(10,0)แต่ฉันได้รับข้อผิดพลาด:

ไม่สามารถแคสต์คอลัมน์ "code" เพื่อพิมพ์ตัวเลขได้

คำตอบ:


245

คุณสามารถลองใช้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ที่ไม่สามารถแปลงเป็นตัวเลขได้ หากการใช้ล้มเหลวคุณจะต้องล้างข้อมูลที่ไม่ใช่ตัวเลขด้วยมือก่อนที่จะเปลี่ยนประเภทคอลัมน์


คอลัมน์นี้ใช้เป็นคีย์ต่างประเทศในตารางอื่นฉันเดาว่าฉันจะต้องเปลี่ยนประเภทข้อมูลด้วยหรือไม่
user728630

2
@ user728630: คุณจะต้องวาง FK เปลี่ยนทั้งสองคอลัมน์จากนั้นเพิ่ม FK กลับ คุณมีฐานข้อมูลทดสอบสำหรับเล่นและสำรองฐานข้อมูลการผลิตใช่ไหม?
สั้นเกินไป

ฉันลบข้อ จำกัด คีย์ภายนอกเปลี่ยนประเภทข้อมูล แต่หลังจากนั้นไม่สามารถเพิ่ม FK ได้ รับข้อผิดพลาดต่อไปนี้: แทรกหรืออัปเดตในตาราง "ใบแจ้งหนี้" ละเมิดข้อ จำกัด ของคีย์ต่างประเทศ "invoice_presale_fk" DETAIL: คีย์ (sale, cpf_cnpj) = (4,05943560000101) ไม่มีอยู่ในตาราง "ยอดขายล่วงหน้า"
user728630

2
@funwhilelost นั่นเป็นประเภทหล่อ เอกสาร ALTER TABLE ที่เชื่อมโยงครอบคลุมสิ่งที่คุณสามารถใช้กับ USING ได้
สั้นเกินไป

3
@muistooshort ฉันเห็นจากเอกสารมันเป็นสำนวนจริงๆ ที่เข้าท่ากว่า นักแสดงประเภทจับฉันไม่ทัน ฉันลงเอยด้วยTYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
fun whilelost

7

หากVARCHARคอลัมน์ของคุณมีสตริงว่าง (ซึ่งไม่เหมือนกับNULLPostgreSQL อย่างที่คุณอาจจำได้) คุณจะต้องใช้บางสิ่งในบรรทัดต่อไปนี้เพื่อตั้งค่าเริ่มต้น:

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

(พบด้วยความช่วยเหลือของคำตอบนี้ )


0

ขั้นตอนที่ 1: เพิ่มคอลัมน์ใหม่ด้วยจำนวนเต็มหรือตัวเลขตามความต้องการของคุณ

ขั้นตอนที่ 2: เติมข้อมูลจากคอลัมน์ varchar เป็นคอลัมน์ตัวเลข

ขั้นตอนที่ 3: วางคอลัมน์ varchar

ขั้นตอนที่ 4: เปลี่ยนชื่อคอลัมน์ตัวเลขใหม่ตามคอลัมน์ varchar เก่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.