Tidak ada pemeran implisit (otomatis) dari text atau varchar ke integer (yaitu Anda tidak dapat melewati varchar ke fungsi yang mengharapkan integer atau tetapkan varchar bidang ke integer 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 spasi 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 spasi sebelum mengonversi.
Ini seharusnya sudah jelas dari pesan kesalahan jika perintah dijalankan di psql , tetapi ada kemungkinan PgAdmin-III tidak menunjukkan kesalahan penuh kepada Anda. Inilah yang terjadi jika saya mengujinya di psql pada 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 telah menambahkan USING tautan.
Lihat juga pertanyaan terkait ini; ini tentang migrasi Rails, tetapi penyebab dasarnya sama dan jawabannya berlaku.
Jika kesalahan masih terjadi, maka itu mungkin tidak terkait dengan nilai kolom, tetapi indeks di atas kolom atau nilai default kolom ini mungkin gagal typecast. Indeks harus dibuang sebelum ALTER COLUMN dan dibuat ulang setelahnya. Nilai default harus diubah dengan tepat.