Cara mengubah tipe data kolom dari karakter menjadi numerik di PostgreSQL 8.4

137

Saya menggunakan kueri berikut:

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

untuk mengubah tipe data kolom dari character(20)menjadi numeric(10,0)tetapi saya mendapatkan kesalahan:

kolom "kode" tidak dapat ditransmisikan untuk mengetik numerik

pengguna728630
sumber

Jawaban:

245

Anda dapat mencoba menggunakan USING:

USINGKlausa opsional menentukan cara menghitung nilai kolom baru dari yang lama; jika dihilangkan, konversi default sama dengan penugasan dari tipe data lama ke baru. Sebuah USINGklausul harus disediakan jika tidak ada implisit atau tugas cor dari lama ke jenis baru.

Jadi ini mungkin berhasil (tergantung pada data Anda):

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

Ini akan gagal jika Anda memiliki sesuatu codeyang tidak dapat diubah menjadi numerik; jika PENGGUNAAN gagal, Anda harus membersihkan data non-numerik secara manual sebelum mengubah jenis kolom.

mu terlalu pendek
sumber
kolom ini digunakan sebagai kunci asing di tabel lain, saya rasa saya harus mengubah tipe data itu juga?
pengguna728630
2
@ user728630: Anda harus menghapus FK, mengubah kedua kolom, lalu menambahkan FK kembali. Anda memang memiliki database uji untuk dimainkan dan cadangan database produksi, bukan?
mu terlalu pendek
saya menghapus batasan kunci asing, mengubah tipe data tetapi setelah itu tidak dapat menambahkan FK. Mendapatkan kesalahan berikut KESALAHAN: menyisipkan atau memperbarui tabel "faktur" melanggar batasan kunci asing "invoice_presale_fk" DETAIL: Kunci (penjualan, cpf_cnpj) = (4,05943560000101) tidak ada dalam tabel "prapenjualan".
pengguna728630
2
@funwhilelost Itu tipe pemeran . Dokumen ALTER TABLE tertaut mencakup apa yang dapat Anda gunakan dengan MENGGUNAKAN.
mu terlalu pendek
3
@muistooshort Saya melihat dari dokumen itu sebenarnya adalah ekspresi. Itu lebih masuk akal. Jenis pemeran itu membuatku lengah. Saya berakhir denganTYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
funwhilelost
7

Jika VARCHARkolom Anda berisi string kosong (yang tidak sama dengan NULLPostgreSQL yang mungkin Anda ingat), Anda harus menggunakan sesuatu di baris berikut untuk menyetel default:

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

(ditemukan dengan bantuan jawaban ini )

Patru
sumber
0

Langkah 1: Tambahkan kolom baru dengan integer atau numerik sesuai kebutuhan Anda

Langkah 2: Isi data dari kolom varchar ke kolom numerik

Langkah 3: Jatuhkan kolom varchar

Langkah 4: Ubah nama kolom numerik baru sesuai kolom varchar lama

PATEL PIYUSHKUMAR
sumber