Tidak ada pemeran implisit (otomatis) dari text
atau varchar
ke integer
(yaitu Anda tidak bisa meneruskan varchar
fungsi ke mengharapkan integer
atau menetapkan varchar
bidang ke integer
salah satu), jadi Anda harus menentukan pemeran eksplisit menggunakan ALTER TABLE ... ALTER COLUMN ... TYPE. .. MENGGUNAKAN :
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Perhatikan bahwa Anda mungkin memiliki ruang kosong di bidang teks Anda; dalam hal ini, gunakan:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
untuk menghapus ruang putih sebelum mengkonversi.
Ini seharusnya sudah jelas dari pesan kesalahan jika perintah dijalankan psql
, tetapi mungkin PgAdmin-III tidak menunjukkan kepada Anda kesalahan penuh. Inilah yang terjadi jika saya mengujinya di psql
PostgreSQL 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
Terima kasih @muistooshort karena menambahkan USING
tautan.
Lihat juga pertanyaan terkait ini ; ini tentang migrasi Rails, tetapi penyebab dasarnya adalah sama dan jawabannya berlaku.
Jika kesalahan masih terjadi, maka itu mungkin terkait bukan dengan nilai kolom, tetapi indeks di atas kolom ini atau nilai default kolom mungkin gagal typecast. Indeks harus dijatuhkan sebelum ALTER COLUMN dan dibuat kembali sesudahnya. Nilai default harus diubah dengan tepat.