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.